【发布时间】:2021-03-16 02:34:27
【问题描述】:
我刚开始使用 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>
【问题讨论】:
-
您的
runSlow()函数是一种可怕的、可怕的延迟执行方式;这是对 CPU 资源的同步浪费。 -
这里有一个小玩意儿:jsfiddle.net/e35uv12o
-
Promise 是一种处理异步进程的策略,而不是运行缓慢的进程。
-
Promise 不会使紧密的同步循环(如你的 while 循环)异步..
-
@edaus 还请注意,当您拒绝承诺时,不需要 Error() 。你可以直接拒绝它。
标签: javascript promise