只要其结果尚未解决,promise将始终记录未决。
.then无论promise状态如何(已解决或仍处于待处理状态),您都必须调用promise来捕获结果:
let AuthUser = function(data) { return google.login(data.username, data.password).then(token => { return token } )}let userToken = AuthUser(data)console.log(userToken) // Promise { <pending> }userToken.then(function(result) { console.log(result) // "Some User token"})这是为什么?
承诺只是向前的方向;您只能解决一次。a的解析值
Promise传递给其
.then或
.catch方法。
细节
根据Promises / A +规范:
承诺解决程序是一个抽象操作,将承诺和值作为输入,我们将其表示为[[Resolve]](promise,x)。如果x是可能的,则在x的行为至少类似于承诺的假设下,尝试使承诺采用x的状态。否则,它将以值x履行承诺。
只要有实现Promises / A +兼容then方法,对可实现对象的这种处理就可以使promise实现能够互操作。它还允许Promises / A
+实现使用合理的then方法“整合”不合格的实现。
这个规范很难解析,所以让我们分解一下。规则是:
如果
.then处理程序中的函数返回一个值,则
Promise使用该值进行解析。如果处理程序返回另一个
Promise,则原始处理程序将
Promise使用链式的已解析值进行解析
Promise。下一个
.then处理程序将始终包含前一个中返回的链接诺言的已解析值
.then。
下面更详细地描述了它的实际工作方式:
1..then
函数的返回将是promise的已解决值。
function initPromise() { return new Promise(function(res, rej) { res("initResolve"); })}initPromise() .then(function(result) { console.log(result); // "initResolve" return "normalReturn"; }) .then(function(result) { console.log(result); // "normalReturn" });2.如果.then
函数返回a Promise
,则该链接的诺言的已解析值将传递给以下对象.then
。
function initPromise() { return new Promise(function(res, rej) { res("initResolve"); })}initPromise() .then(function(result) { console.log(result); // "initResolve" return new Promise(function(resolve, reject) { setTimeout(function() { resolve("secondPromise"); }, 1000) }) }) .then(function(result) { console.log(result); // "secondPromise" });


