Promise.all из массива Promises, созданный с заполнением, выполненным только один раз - PullRequest
0 голосов
/ 23 февраля 2019

Я столкнулся с действительно странной ошибкой.Я вызываю одну и ту же конечную точку несколько раз, чтобы проверить производительность своего приложения.Когда я делаю следующий тест:

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 или других веб-серверов.

1 Ответ

0 голосов
/ 23 февраля 2019

Это не проблема кеша.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...