【发布时间】:2015-08-28 06:33:34
【问题描述】:
理论:
我一开始就做出了大约 100 个承诺,然后使用Promise.all() 解决它们。
这 100 个 Promise 中的每一个都会依次进行一些异步 REST 调用,其响应可能主要有所不同(例如由于网络连接)。
解决所有 100 个承诺的过程大约需要 20 秒。在此期间,应向用户提供进度的实时反馈,以保持其参与度。
为了实现这些异步操作的进度,我正在考虑在客户端使用 progressCounter,其值将在每个 Promise 解决后立即更新。
问题是,如果 progressCounter = 1 并且所有这些操作都是异步的,我担心会遇到竞争条件,例如,两个不同的 Promise 检索到的 progressCounter 的当前值可能会被发现相同,即 1,因此他们可能会尝试将 progressCounter 增加到相同的值,即 2。因此,由于竞争条件,最终值不会是 3。
实验: 我试图重现这个理论,但无法使用以下内容:
var progress = {};
progress.counter = 1;
var promise1 = new Promise(function(resolve, reject) {
resolve();
});
var promise2 = new Promise(function(resolve, reject) {
resolve();
});
promise1.then(function() {
progress.counter += 1;
});
promise2.then(function() {
progress.counter += 1;
});
setTimeout(function() {
alert(progress.counter); // progress.counter: 3
}, 1000);`
问题: 问题是可以达到上述理论描述的这种竞争条件吗?如果不是,该理论有何缺陷? 如果是,有什么好方法可以跟踪承诺的解决进度?
【问题讨论】:
-
您发布的代码似乎有效。你能产生你在实际代码中描述的情况,以便我们进行测试吗?
-
另外,我没有看到任何代码在增加之前检查
progress.counter的值,所以我看不出这种竞争条件是如何发生的。 -
JavaScript 是单线程的,所以两段代码不能同时执行。即使它是线程化的,
+=也是一个单一的操作,所以无论如何都不能改变变量的值。 -
查看“JavaScript 是否保证是单线程的?”线程stackoverflow.com/questions/2734025/…
-
@Juhana 如果它是多线程的,可能存在竞争条件。
+=是 javascript 中的单个语句,但在较低级别,它是一组非原子指令..跨度>
标签: javascript asynchronous promise