javascript-为什么Promise.all(array)无法立即解决?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-为什么Promise.all(array)无法立即解决?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2174字,纯文字阅读大概需要4分钟。
内容图文
![javascript-为什么Promise.all(array)无法立即解决?](/upload/InfoBanner/zyjiaocheng/683/2868780592cc46e3b2b81d74bf4f0ca2.jpg)
我在计算机上安装以下代码示例(安装了Node 5.8.0)并获得下一个结果(请参见代码示例之后).
代码示例:
'use strict'
var p1 = Promise.resolve();
var p2 = Promise.resolve();
var p12 = Promise.all([p1, p2]);
var cb = function() {
console.log(p12);
}
setTimeout(cb, 0);
console.log(p1);
console.log(p2);
console.log(p12);
结果:
承诺{未定义}
承诺{未定义}
承诺{< pending> }
承诺{[undefined,undefined]}
为什么为什么在p1和p2之后不能立即解析p12(在程序开始时给出p1和p1的解析结果)?为什么“超时”的p12被解析了?
Promise.all(array)得到解决需要一些时间吗?
解决方法:
根据promise规范,在事件循环结束其当前周期之后,总是异步调用promise满足或拒绝处理程序.因此,即使p12的参数都是已解决的承诺,也不会立即解决它.因此,直到此事件循环结束后不久,它才会得到解决.这解释了为什么您的第一条陈述:
console.log(p12);
表明诺言仍在“待决”中.当前尚未调用.then()处理函数(如果有).但是,一旦当前代码线程完成执行,并且控制权返回事件队列中的下一个事件,则将解决promise,因此您的setTimeout()会在那时将其视为已解决.
这样做是出于调用者一致性的原因,因此无论是否已解决了承诺,都以异步方式一致地调用.then()处理程序.这使调用代码可以始终一致地进行编码,而不必担心诺言是否已被解决.在所有情况下,.then()处理函数都会在当前堆栈展开并完成后调用.
onFulfilled or onRejected must not be called until the execution
context stack contains only platform code.Here “platform code” means engine, environment, and promise
implementation code. In practice, this requirement ensures that
onFulfilled and onRejected execute asynchronously, after the event
loop turn in which then is called, and with a fresh stack. This can be
implemented with either a “macro-task” mechanism such as setTimeout or
setImmediate, or with a “micro-task” mechanism such as
MutationObserver or process.nextTick. Since the promise implementation
is considered platform code, it may itself contain a task-scheduling
queue or “trampoline” in which the handlers are called.
因此,所有这一切的结果就是保证始终在当前执行线程完成后异步解析.尽管内部细节可能比这要复杂一些(也许涉及微任务),但是您可以从逻辑上考虑通过将一条消息发布到事件队列中来解决已被解决/拒绝的诺言,从而实现诺言.而且,只要事件队列完成了当前正在运行的操作并轮到运行promises .then()处理程序,它们就会执行.
内容总结
以上是互联网集市为您收集整理的javascript-为什么Promise.all(array)无法立即解决?全部内容,希望文章能够帮你解决javascript-为什么Promise.all(array)无法立即解决?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。