gpt4 book ai didi

javascript - promise 进度

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:32:24 27 4
gpt4 key购买 nike

理论:我在开始时做出了大约 100 个 promise ,然后使用 Promise.all() 解决它们。

这 100 个 promise 中的每一个依次进行一些异步 REST 调用,其响应可能主要不同(例如由于网络连接)。

解决所有 100 个 promise 的过程大约需要 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);`

问题:问题是上面理论上描述的这样的竞争条件可以被击中吗?如果不是,该理论有何缺陷?如果是,跟踪 promise 解决进度的好方法是什么?

最佳答案

Question: Question is can such a race condition be hit described in theory above? If not, how is the theory flawed?

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

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

关于javascript - promise 进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32260367/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com