为什么我的异步函数返回Promise { }而不是值?

我的代码:

let AuthUser = data => {

return google.login(data.username, data.password).then(token => { return token } )

}

当我尝试运行这样的东西时:

let userToken = AuthUser(data)

console.log(userToken)

我越来越:

Promise { <pending> }

但为什么?

我的主要目标是将令牌(从令牌google.login(data.username,

data.password)中返回承诺)转换为变量。然后才执行一些操作。

回答:

只要其结果尚未解决,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

下面更详细地描述了它的实际工作方式:

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"

});

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"

});

以上是 为什么我的异步函数返回Promise { }而不是值? 的全部内容, 来源链接: utcz.com/qa/430358.html

回到顶部