提问者:小点点

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


我的代码:

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)中的token转换为一个变量。然后才预形成一些动作。


共2个答案

匿名用户

只要其结果尚未解决,该承诺将始终记录为挂起状态。您必须调用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"
})

这是为什么?

承诺只是前进的方向;只能解决一次。promise的解析值将传递给其.then.catch方法。

根据承诺/A+规范:

promise resolution过程是一个抽象操作,将promise和一个值作为输入,我们将其表示为[[Resolve]](promise,x)。如果x是一个许诺,它试图使许诺采用x的状态,前提是x的行为至少有点像一个许诺。否则,它将用值x实现承诺。

对TheEnables的这种处理允许promise实现互操作,只要它们公开一个符合Promission/a+的then方法。它还允许Promission/A+实现用合理的then方法“同化”不符合的实现。

这个规范有点难解析,所以让我们把它分解一下。规则是:

如果.then处理程序中的函数返回一个值,则promise使用该值进行解析。如果处理程序返回另一个promise,则原始promise将使用链接的promise的解析值解析。下一个.then处理程序将始终包含在前一个.then中返回的链接承诺的解析值。

下面将更详细地介绍它的实际工作方式:

1..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"
  });

2.如果.then函数返回一个承诺,则将该链接承诺的解析值传递给下面的.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"
  });

匿名用户

我知道这个问题是两年前提出的,但我遇到了同样的问题,问题的答案是自ES2017以来,您可以简单地await函数返回值(到目前为止,仅适用于async函数),例如:

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

let userToken = await AuthUser(data)
console.log(userToken) // your data

相关问题