源码看这里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)); });}
3 回答

12345678_0001
TA贡献1802条经验 获得超5个赞
没太研究过,这应该是某个polyfill的Promise实现吧?V8的Promise应该是cpp写的。
这段代码看起来应该是为了让一些继承自Promise的子类运行正常。

摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
最好附上这段代码的来源,因为 Promise 有很多实现,这样写看不太出来作者有何想法。
另外还有一个办法,寻找这一行的提交记录,看看作者写的时候是怎么想的。

德玛西亚99
TA贡献1770条经验 获得超3个赞
就比如
const getVal = new P(resolve => resolve('todo'));
getVal.then.bind(window).then((val) => { console.log(val) });
// 上面的bind改变了then的上下文,就会安全的执行safeThen
添加回答
举报
0/150
提交
取消