为了账号安全,请及时绑定邮箱和手机立即绑定

promise的源码问题,谷歌不到特来求救

promise的源码问题,谷歌不到特来求救

慕田峪4524236 2019-01-30 09:33:44
问题描述看了一段promise的源码看到这段很是不懂jsfunction resolve(value) { // value成功态时接收的终值    if(value instanceof Promise) {        return value.then(resolve, reject);     }  }你期待的结果是什么?实际看到的错误信息又是什么?promise里resolvePromise这个函数中不是已经通过if (x instanceof Promise)else if (x != null && ((typeof x === 'object') || (typeof x === 'function')))当到resolve为什么要去判断value是不是promise呢
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

可以考虑下面的代码:

let promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('promise1')
  }, 5000)
})let promise2 = new Promise((resolve, reject) => {
  resolve(promise1)
}).then(result => {  console.log(result) // 大概5s之后输出字符串promise1})

当你resolve一个promise的时候,有两种结果:

  1. promise对象当成该promise resolve的结果;

  2. promise对象resolve的结果当成该promise resolve的结果;

如果你想要结果1if (x instanceof Promise)这句代码就不需要了,但是promise的规范规定的应该是结果2,所以大部分实现都会有这个if (x instanceof Promise)判断。
在浏览器实际运行上面的代码,是在大概5秒后log出字符串promise1,如果是结果1的话,应该是比较快的log出一个promise对象。再比如下面的例子:

let promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('promise1')
  }, 5000)
})let promise2 = new Promise((resolve, reject) => {
  resolve('promise2')
}).then(() => {  return promise1
}).then(result => {  console.log(result) // 同样是大概5s之后输出字符串promise1})


查看完整回答
反对 回复 2019-01-30
  • 1 回答
  • 0 关注
  • 494 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信