更新Promise.all()
中的值时,是否保证以下结果?我的理解是,内部功能将并行发生,但这将如何影响结果?
a
将为6(0+1+2+3(b
的长度为8(长度为d*2(- 订单不保证
c
的长度为3,除c['a']
外,所有密钥/值对都得到保证
const networkCall = async () => {
// takes time
}
const update = async (i) => {
let a = 0;
let b = [];
let c = {};
const d = ['a', 'b', 'c', 'a'];
await Promise.all(d.map(async (i, index) => {
await networkCall();
a += index;
b.push(i);
b = [i, ...b]
c[i] = index;
});
console.log(a);
console.log(b);
console.log(c);
}
update()
我仔细研究了类似的问题,但没有找到令人满意的答案。
在
Promise.all()
中更新值时。。。
Promise.all
与更新a
、b
和c
的值无关。Promise.all
将只接受一系列承诺并创建一个新的承诺。就是这样。在任何异步代码执行之前,都会返回新的promise。它不会影响某些回调函数进行更新的方式。Promise.all
返回的promise在这里用于确保只有在所有异步代码都已执行时才进行console.log
调用。
我的理解是,内部功能将并行发生,
"平行的";可能有不同的含义。。。并不是说每一句话都可以单独与另一句话进行循环。在这种特殊情况下,可以保证对于给定index
的,await
下面的四条语句作为一个不间断的块执行,而不运行任何其他JavaScript。只有当该块完成(并且回调返回(时,才有可能为该块的另一个执行上下文(具有不同的index
变量和值(执行相同的块。
a
将是6(0+1+2+3(
是的,在执行console.log(a)
时可以保证这一点,即使它可能被计算为1+0+3+2。
b
的长度为8(d * 2
的长度(--订单不能保证
是。顺序是不保证的,但是数组被保证是"有序"的;回文":b[i] === b.at(-i-1)
c
的长度为3,除c['a']
外,所有密钥/值对都得到保证
是。