我想向自己解释下面使用javascript promises的代码片段的执行顺序.
Promise.resolve('A')
.then(function(a){console.log(2, a); return 'B';})
.then(function(a){
Promise.resolve('C')
.then(function(a){console.log(7, a);})
.then(function(a){console.log(8, a);});
console.log(3, a);
return a;})
.then(function(a){
Promise.resolve('D')
.then(function(a){console.log(9, a);})
.then(function(a){console.log(10, a);});
console.log(4, a);})
.then(function(a){
console.log(5, a);});
console.log(1);
setTimeout(function(){console.log(6)},0);
Run Code Online (Sandbox Code Playgroud)
结果是:
1
2 "A"
3 "B"
7 "C"
4 "B"
8 undefined
9 "D"
5 undefined
10 undefined
6
Run Code Online (Sandbox Code Playgroud)
我很好奇执行顺序1 2 3 7 ...而不是值'A','B'......
我的理解是,如果一个promise得到解决,'then'函数将被放入浏览器事件队列中.所以我的期望是1 2 3 4 ......
@ jfriend00谢谢,非常感谢您的详细解释!这真是一项巨大的工作!
为了理解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中为上述示例定义了执行顺序,还是由实现决定?
如果定义了,那么正确的输出应该是什么?
我正在学习 js 中的 Promise,我对此有一些疑问,这是代码:
Promise.resolve().then(() => {
console.log(0);
return Promise.resolve(4);
}).then((res) => {
console.log(res)
})
Promise.resolve().then(() => {
console.log(1);
}).then(() => {
console.log(2);
}).then(() => {
console.log(3);
}).then(() => {
console.log(5);
}).then(() => {
console.log(6);
})Run Code Online (Sandbox Code Playgroud)
输出与我预期的相差甚远,我认为它会是 0 1 4 2 3 5 6,因为我在 MDN 上看到了这个
Promise.resolve() 方法返回一个使用给定值解析的 Promise 对象
那么 log() 方法不应该在数字 1 后面触发吗?
我究竟做错了什么?
对于以下代码
function inner () {
new Promise(function(resolve,reject){
resolve()
}).then(function(){
console.log('Inner Promise')
})
}
function outer() {
return new Promise(function(resolve, reject){
resolve()
inner()
})
}
outer().then(function(data) {
console.log('Outer Promise')
})
Run Code Online (Sandbox Code Playgroud)
输出是
Inner Promise
Outer Promise
Run Code Online (Sandbox Code Playgroud)
我认为外部决心将是第一个进入JS Message Queue,然后是内部解析.然而,JS事件循环首先触发内部解析,然后是外部解析.
Promise在内部解决了什么?