javascript - Javascript承诺执行时间问题
问题描述
我刚刚开始使用 JS 承诺概念,我无法理解为什么在这个例子中两个单独的承诺实际上是“依赖”的(也就是说,为什么如果只声明了“var promise”,执行时间是 2.5 秒,但是当两者都“ var promise" 和 "var promise2" 被声明,两者的执行延迟都是 10s)。
如果两者都声明了,并且只执行了 Promise,我预计它会在 2.5 秒内运行。然而,一旦两者都被声明,console.log 输出会以相同的、更长的延迟出现。这是为什么?如果我添加 Promise.all,我希望console.log 输出承诺出现在 2.5 秒和 Promise.all 出现在 10 秒,但两者同时出现。
function runSlow(delay) {
const start = Date.now();
while (Date.now() - start < delay) { } // force a loop to wait 5 seconds is 5000
return true;
}
$(document).ready(function () {
var promise = new Promise(function(resolve, reject) {
// do a thing, possibly async, then…
var it=runSlow(2500);
if (it) {
resolve("Stuff worked!");
}
else {
reject(Error("It broke"));
}
});
var promise2 = new Promise(function(resolve, reject) {
// do a thing, possibly async, then…
var it=runSlow(10000);
if (it) {
resolve("Stuff worked too!");
}
else {
reject(Error("It broke too"));
}
});
promise.then(function(result) {
console.log(result); // "Stuff worked!"
}, function(err) {
console.log(err); // Error: "It broke"
});
/*
Promise.all([promise, promise2]).then(values => {
console.log(values);
});
*/
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
解决方案
Promise 构造函数同步运行。
所以你在做的是真的
blockThreadFor5s();
scheduleMicroTask();
blockThreadFor5s();
scheduleMicroTask();
Promise 反应将在下一个微任务检查点上执行,这只会在所有同步代码都执行后才会发生,即在两者之后blockThreadFor5s
。
推荐阅读
- ngx-bootstrap - datepicker 每月最后一天的样式
- localization - 如何根据使用 gatsby-theme-i18n-react-i18next 选择的语言更改 url 中的 slug?
- visual-studio-code - 替换 VSCode 中的现有选项卡
- android - 当用户从应用程序更改语言时膨胀可绘制的本地化资源运行时 [android]
- c# - WPF C#中的滚动条只允许滚动到一半的内容
- apache - 安装在 mac m1 机器上的 Apache Web 服务器在启动时抛出错误
- typescript - 使用打字稿的汇总替换插件找不到变量名
- batch-file - 移动具有相同扩展名的子文件夹中的所有文件
- r - 使用 tidymodels 调整工作流集时如何正确设置参数网格?
- amazon-web-services - aws 有没有像 vimeo 这样的视频服务?