Liv*_*vio 9 javascript es6-promise
我正在学习 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 后面触发吗?
我究竟做错了什么?
Promise 不会直接处理,而是基于队列。如果 Promise 完成,则回调将在下一个处理周期中处理。
如果我们用更详细的代码替换您的代码,我们会得到:
const a = Promise.resolve('a');
const b = a.then(() => {
console.log('b');
const c = Promise.resolve('c');
return c;
});
const ca = b.then((res) => {
console.log('ca', res)
})
const u = Promise.resolve('u');
const v = u.then(() => {
console.log('v');
});
const w = v.then(() => {
console.log('w');
});
const x = w.then(() => {
console.log('x');
});
const y = x.then(() => {
console.log('y');
});
const z = y.then(() => {
console.log('z');
});Run Code Online (Sandbox Code Playgroud)
首先,代码从上到下运行,并没有发生太多事情。两个承诺被放入队列中作为已解决(a和u),并且没有打印任何内容。当这些在下一个周期中被处理时,它们会将b和排队v。
每当处理下一个周期时,b首先将记录"b"并排队c。之后,v进行处理、日志"v"和队列w。
现在,c已完成,并将下一个排队ca(间接,因为在承诺中返回承诺),但不打印任何内容。等等。
一直往下看,它看起来像这样:
// Main tick
// - queue a
// - queue u
// Queue tick
// - resolve a, queues b
// - (log nothing)
// - resolve u, queues v
// - (log nothing)
// Queue tick
// - resolve b, queues c
// - log "b"
// - resolve v, queues w
// - log "v"
// Queue tick
// - resolve c, doesnt log, queues the next (ca)
// - resolve w, queues x
// - log "w"
// Queue tick
// - resolve x, queues y
// - log "x"
// - resolve ca, queues nothing
// - log "ca, c"
// Queue tick
// - resolve y, queues z
// - log "y"
// Queue tick
// - resolve z
// - log "z"
Run Code Online (Sandbox Code Playgroud)
我不知道这是否是实际要求,因此如果实现(浏览器)决定直接处理承诺,顺序可能会改变。我认为这不太可能,因为它不鼓励公平,并且如果承诺永远被束缚,这个承诺将获得分配给它的所有资源。
我认为一般建议是不要依赖于承诺的完成顺序。想想看a.then(b),b只发生在a完成之后,而不是更早,仅此而已。
如果您需要多个 Promise 相互依赖,请使用Promise.all()或Promise.any()。
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |