Promise源码中safeThen函数如何理解?

发布于 2022-09-07 04:06:41 字数 689 浏览 12 评论 0

源码看这里

Promise.prototype.then = function(onFulfilled, onRejected) {
  if (this.constructor !== Promise) {
    return safeThen(this, onFulfilled, onRejected);
  }
  var res = new Promise(noop);
  handle(this, new Handler(onFulfilled, onRejected, res));
  return res;
};

function safeThen(self, onFulfilled, onRejected) {
  return new self.constructor(function (resolve, reject) {
    // 以下不是很理解
    var res = new Promise(noop);
    res.then(resolve, reject);
    handle(self, new Handler(onFulfilled, onRejected, res));
  });
}

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

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

发布评论

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

评论(3

迷乱花海 2022-09-14 04:06:41

没太研究过,这应该是某个polyfill的Promise实现吧?V8的Promise应该是cpp写的。

这段代码看起来应该是为了让一些继承自Promise的子类运行正常。

御弟哥哥 2022-09-14 04:06:41

最好附上这段代码的来源,因为 Promise 有很多实现,这样写看不太出来作者有何想法。

另外还有一个办法,寻找这一行的提交记录,看看作者写的时候是怎么想的。

素手挽清风 2022-09-14 04:06:41

就比如

const getVal = new P(resolve => resolve('todo'));
getVal.then.bind(window).then((val) => { console.log(val) });

// 上面的bind改变了then的上下文,就会安全的执行safeThen
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文