我面临一个非常奇怪的错误。我多次调用同一终结点,因此可以测试应用程序的性能。当我执行以下测试时:
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服务器。
答案 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);