JS асинхронно с использованием массива push () shift () - PullRequest
0 голосов
/ 14 марта 2019

У меня есть два интервала, которым нужен доступ к одним и тем же данным. Таким образом, в одном интервале я хочу нажать () элемент в массив, а затем в другом интервале я хочу получить первый элемент из массива, а затем удалить его.

например:

let array = [];
let count = 0;

setInterval( () => {
    array.push(count);
    count++;
}, 1000);

setInterval( () => {
    let data = array[0];
    array.shift();
    console.log("received data: "+data);
}, 1000);

вывод этого:

received data: 0
received data: 1
received data: 2
received data: 3
....

Работает ли это также с более сложными функциями и большими массивами? Может ли это вызвать какое-то странное поведение? Может быть, он может одновременно сдвигаться, толкаться и портить массив? Это хороший способ сделать это? Есть ли лучшие способы?

EDIT:
Причина, по которой я хочу это сделать. Это потому, что я хочу скачать данные из разных ссылок. Поэтому внутри моего скрипта я вызываю функцию загрузки (ссылки), но это приведет к тому, что скрипт попытается загрузить много ссылок одновременно. Поэтому я хочу создать буфер, чтобы скрипт загружал только 100 ссылок одновременно.
Внутри скрипта я хочу вызвать загрузку (ссылку), где я хочу, а затем дать интервал позаботиться о загрузке только 100 ссылок одновременно. Таким образом, он удаляет 100 ссылок из буфера и загружает их. Пока скрипт вставляет новые ссылки в тот же массив.

Моя главная проблема в том, что, пока я выполняю shift (), массив каким-то образом реорганизуется. Можно ли попытаться сделать push () между этой фазой реорганизации? Или js не будет выполнять никаких операций над массивом, пока не будет завершен shift ()?

1 Ответ

2 голосов
/ 14 марта 2019

Ваша общая идея помещать ссылки на массив асинхронно, а затем удалять их из массива в отдельной асинхронной задаче, это хорошо, это сработает.

Моя главная проблема в том, что, пока я выполняю shift (), массив как-то реорганизуется. Можно ли попытаться сделать push () между этой фазой реорганизации? Или js не будет выполнять никаких операций над массивом до тех пор, пока не будет завершен shift ()?

Javascript является однопоточным, так что об этом не стоит беспокоиться - если один интервал запускает функцию, выполняющую какие-либо действия, синхронные действия этой функции (например, манипулирование массивом) будут выполняться до конца до того, как могут выполняться любые другие интервальные обратные вызовы.

Проблема общего изменяемого состояния является проблемой для многих других языков, но не для Javascript, по крайней мере, в большинстве случаев.

...