当前位置: 首页 > 面试题库 >

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

商骞仕
2023-03-14
问题内容

我的代码:

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

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

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


 类似资料:
  • 我的代码: 当我尝试运行这样的东西时: 我得到了: 但为什么? 我的主要目标是将返回承诺的中的token转换为一个变量。然后才预形成一些动作。

  • 我试图了解异步/等待如何与promise一起工作。 据我所知,await应该是阻塞的,在上面的代码中,它似乎阻塞了返回带有原语

  • 我有一个异步函数,它调用其中的另一个异步函数。此异步函数正在返回" 你能帮我解决这个问题吗? 以下是第一个异步函数: 如你所见,我调用updateAllProducts函数,并将该值存储到一个变量调用newAllProducts. updateAllProducts是另一个异步函数。 以下是updateAllProducts的代码: 此updateAllProducts函数正在调用另一个异步函数调

  • 考虑以下代码: 这是我得到的输出: 但是如果我把代码改成这样: 我会得到这个: 我很困惑,因为根据文档,应该暂停执行,直到promise得到解决。在这种情况下,第一个示例应该以数组的形式返回

  • 我正在学习react native,我遇到了一个问题。为什么从异步函数返回时获取数据会返回一个promise,但在异步函数本身中,它会正确地返回一个对象数组? 在上,我调用我的异步函数,该函数反过来提取api url: 在,我得到了正确的json对象列表,我可以使用。但后来,返回包含奇数数据的promise: ... 我再也找不到我的json对象了。为什么会这样?更重要的是,如何在中检索json数

  • 问题内容: 我有一个箭头函数,看起来像这样(简化): 但是当我调用它时,我得到: 为什么? 例: ( 注意: 对于上述带有箭头功能的 特定 问题,这是一个干净,规范的重复目标。) 问题答案: 当您使用箭头函数的函数主体版本(带有)时,没有暗示。您必须指定它。当您使用 简洁 主体(no )时,主体表达式的结果将由函数隐式返回。 因此,您可以使用显式的方式编写该代码: 或简洁的主体: 例子: 略 切线