【问题标题】:Progress of promises承诺进度
【发布时间】: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


【解决方案1】:

问题:问题是这样的竞争条件是否可以达到上述理论上的描述?如果不是,这个理论有什么缺陷?

答案是,这样的竞态条件在Javascript中不可能发生,因为Javascript是单线程的。 (参见:MDN 上的Concurrency Model and Event Loop

这意味着当一个回调处理程序正在处理数据时(假设设置计数器是一个同步操作,+= 是),没有什么可以强迫它“屈服”它的执行,下一个处理程序只能在前一个处理程序完成时运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2012-09-13
    • 2017-03-16
    相关资源
    最近更新 更多