栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/575073.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号