承诺的进展

cho*_*hoc 3 javascript asynchronous promise

理论: 我在开始时做了大约100个承诺,然后用它来解决它们Promise.all().

这100个承诺中的每一个依次进行一些异步REST调用,其响应可能主要变化(例如由于网络连接).

解决所有100个承诺的过程大约需要20秒.在此期间,应向用户提供进度的实时反馈,以使他保持参与.

为了实现这些异步操作的进度,我想在客户端使用progressCounter,它的值将在每个promise被解析后立即更新.

事情是,如果progressCounter = 1并且所有这些操作都是异步的,我担心会遇到一种竞争条件,例如,由两个不同的promises检索的progressCounter的当前值可能会被发现为1,因此他们可能会尝试增加progressCounter因为竞争条件,所以最终值不会是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);` 
Run Code Online (Sandbox Code Playgroud)

问题: 问题是否可以在上面的理论中描述这样的竞争条件?如果没有,理论有何缺陷?如果是,那么跟踪承诺解决进度的好方法是什么?

dol*_*ldt 7

问题:问题是否可以在上面的理论中描述这样的竞争条件?如果没有,理论有何缺陷?

答案是否定的,Javascript中不会出现这样的竞争条件,因为Javascript是单线程的.(请参阅:MDN上的并发模型和事件循环)

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