我有以下代码:
var incr = num => new Promise(resolve => {
resolve(num + 1);
});
var x = incr(3)
.then(resp => incr(resp))
.then(resp => console.log(resp));
async function incrTwice(num) {
const first = await incr(num);
const twice = await incr(first);
console.log(twice);
}
incrTwice(6);Run Code Online (Sandbox Code Playgroud)
我相信(可能是错误的)显示了实现相同功能的两种等效方法:首先通过链接承诺,其次使用 async/await 的语法糖。
我希望promise 链接解决方案首先是console.log,然后是异步函数,但是异步函数console.log 的第一个然后是promise 链接解决方案打印。
我的逻辑如下:
xs 初始解析将在处理声明时首先出现在微任务队列中x和的声明之间堆栈是空的,incrTwice这将导致微任务队列被刷新(导致承诺链的完成)
incrTwice 被定义为incrTwice在awaits处的微任务队列上执行排队,最终打印到控制台
显然我在某处有误解,有人能够指出我错在哪里吗?
为了理解ES6 promise的执行顺序,我注意到链接处理程序的执行顺序受前一个处理程序是返回值还是promise的影响.
例
let a = Promise.resolve();
a.then(v => Promise.resolve("A")).then(v => console.log(v));
a.then(v => "B").then(v => console.log(v));Run Code Online (Sandbox Code Playgroud)
直接在Chrome(v 61)控制台中运行时的输出:
B
A.
但是,当点击Run code snippet按钮时,我会收到订单A B.
是否在ES6中为上述示例定义了执行顺序,还是由实现决定?
如果定义了,那么正确的输出应该是什么?
我不明白为什么我们执行这段代码会有如此奇怪的结果。
为什么没有 12121212 的图像?在每个 1 之后,我们有三个 2。
Promise.resolve()
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); })
.then(() => { console.log(1); return Promise.resolve(); });
Promise.resolve()
.then(() => { console.log(2); })
.then(() => { console.log(2); })
.then(() => { console.log(2); }) …Run Code Online (Sandbox Code Playgroud)