【问题标题】:Promise.all of array of Promises created with fill only executed just oncePromise.all 使用 fill 创建的 Promise 数组只执行一次
【发布时间】:2019-07-17 10:03:37
【问题描述】:

我面临一个非常奇怪的错误。我多次调用同一个端点,所以我可以测试我的应用程序的性能。当我进行以下测试时:

const call = () => axios.post('http://localhost:3000');

(async () => {
  let calls = [call(), call(), call(), call(), call()]
  let responses = await Promise.all(calls);
})();

我在服务器上得到以下日志:

POST / 200 2576.633 ms - 18
POST / 200 2587.848 ms - 18
POST / 200 2596.250 ms - 18
POST / 200 2583.056 ms - 18
POST / 200 3190.753 ms - 18

一切正常! :)

但是如果我像这样动态创建数组:

const call = () => axios.post('http://localhost:3000');

(async () => {
  let calls = new Array(5);
  calls = calls.fill(call());
  let responses = await Promise.all(calls);
})();

服务器上的日志只有一个

POST / 200 3803.059 ms - 18

这怎么可能?和缓存有关吗?

注意:脚本和服务器都使用 Node 10.14.0 服务器是一个最小的 Express 应用程序,没有 Nginx 或其他网络服务器运行。

【问题讨论】:

  • 如果你想让call()被执行五次,你正在寻找Array.from({length: 5}, call)
  • @Bergi 清洁工!谢谢

标签: node.js promise axios


【解决方案1】:

这不是缓存问题。

Array.fill() 不会为每个元素创建一个新对象。它使用相同的对象引用。

function call(){ return new Promise(()=>{})}

var arr1 = new Array(4);
arr1.fill(call());
var arr2 = [call(),call(),call(),call()];

console.log('arr1 =>', arr1);
console.log('arr2 =>', arr2);

console.log('arr1 compare objects arr1[0] === arr1[1] =>', arr1[0] === arr1[1]);
console.log('arr2 compare objects arr2[0] === arr2[1] =>', arr2[0] === arr2[1]);

var arr3 = new Array(4);
arr3.fill({});
arr3[0].a = 1; // update for first 
console.log('Arr3[1].a =>', arr3[1].a);
console.log('Arr3[2].a =>', arr3[2].a);
console.log('Arr3[3].a =>', arr3[3].a);

【讨论】:

    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2017-04-24
    • 2017-02-05
    • 2016-09-08
    • 2019-08-14
    • 2020-01-31
    相关资源
    最近更新 更多