Promsie.resolve(promise对象)为什么then中val是普通值?

发布于 2022-09-12 13:10:16 字数 414 浏览 10 评论 0

问题描述:
image.png
如上图所示,给Promsie.resolve传递一个promise对象结果返回的是1,而不是一个promise对象这是为什么?

通过我对Promise源码的理解,它底层then实现是 如果then里的回调函数返回时一个promise对象,那么他会深度递归调用这个promise的then方法,直到为一个普通值,在使用new Promise 包裹返回这个普通值

如果是 promise.resolve(promise).then().then(val => console.log(val)) 返回普通值我可以理解,因为第二个then已经将返回值promise转为普通值了, 可能少一层我就不理解了。

希望大佬们,可以指点一下,谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

为你拒绝所有暧昧 2022-09-19 13:10:16

Promise.resolve(value)方法返回一个以给定值解析后的Promise对象。如果这个值是一个 promise ,那么将返回这个 promise

这是相关资料

筱果果 2022-09-19 13:10:16
function valuePromise(value) {
  var p = new Promise(Promise._noop);
  p._state = 1;
  p._value = value;
  return p;
}
Promise.resolve = function (value) {
  if (value instanceof Promise) return value;

  if (value === null) return NULL;
  if (value === undefined) return UNDEFINED;
  if (value === true) return TRUE;
  if (value === false) return FALSE;
  if (value === 0) return ZERO;
  if (value === '') return EMPTYSTRING;

  if (typeof value === 'object' || typeof value === 'function') {
    try {
      var then = value.then;
      if (typeof then === 'function') {
        return new Promise(then.bind(value));
      }
    } catch (ex) {
      return new Promise(function (resolve, reject) {
        reject(ex);
      });
    }
  }
  return valuePromise(value);
};

Promise.reslove() 源码,有判断。见:Promise 源码

一枫情书 2022-09-19 13:10:16
Promise.resolve("1").then((valueA)=>console.log('a',valueA)).then((valueB)=>console.log('b',valueB));

输出

a 1 //A
b undefined //B

then方法返回一个Promise对象,可以继续链式调用then方法,传入的函数在Promise对象resove的时候调用,值是传入resolve方法的参数,B输出为undefind是因为前面一个then方法没有显式的返回一个promise对象,函数默认返回了一个resove值为undefined的Promise....

可以一直链式调用下去:)

Promise.resolve("1").then((valueA)=>console.log('a',valueA)).then((valueB)=>console.log('b',valueB)).then((valueC)=>console.log('c',valueC)).then((valueD)=>console.log('d',valueD));
a 1
b undefined
c undefined
d undefined

返回一个promise对象

Promise.resolve("1").then((valueA)=>{
console.log('a',valueA);
return new Promise((resolve,reject)=>{
        resolve('99');
});
}).then((valueB)=>console.log('b',valueB))
a 1
b 99
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文