new Promise((resolve, reject) => {
console.log("async1 start");
console.log("async2");
resolve(Promise.resolve());
}).then(() => {
console.log("async1 end");
});
new Promise(function(resolve) {
console.log("promise1");
resolve();
}).then(function() {
console.log("promise2");
}).then(function() {
console.log("promise3");
}).then(function() {
console.log("promise4");
});
执行结果如下:
async1 start
async2
promise1
promise2
promise3
async1 end
promise4
求大神解释结果为什么是这样的?
谢邀,好久不玩这玩意了。
只对 Chrome 与 Node 最新版本给出自己的一些理解,其他浏览器实现略有差异。
先来一张Typescript中对
Promise
的定义我们发现对
resolve
的类型定义中,接受的参数有PromiseLike
这么个玩意,专业术语叫thenable
,用人话说就是可以带有then
方法的对象。resolve
在想,老子接受到一个thenable
,这样输入具有兼容性,但是输出一定要确定(不确定会被打)。所以要把这个thenable
包装一下,转为正规的Promise
。但是这货又比较懒,不想判断这个thenable
到底是真的Promise
,还是PromiseLike
,就所有的都包装一下,类似下面这样再来一张
按照
A-B-A-B
的顺序来,然后我们模拟一下你问题中的形式你问题中的顺序