Promise。使用填充创建的Promises数组的全部仅执行一次

时间:2019-02-23 12:53:57

标签: node.js promise axios

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

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或其他运行在它们之间的Web服务器。

1 个答案:

答案 0 :(得分:2)

这不是缓存问题。

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);