У меня есть два интервала, которым нужен доступ к одним и тем же данным. Итак, в одном интервале я хочу нажать () элемент в массив, а затем в другом интервале я хочу получить первый элемент из массива, а затем удалить его.
Например:
let array = [];
let count = 0;
setInterval( () => {
array.push(count);
count++;
}, 1000);
setInterval( () => {
let data = array[0];
array.shift();
console.info("received data: "+data);
}, 1000);
вывод этого:
received data: 0
received data: 1
received data: 2
received data: 3
....
Это также работает с более сложными функциями и большими массивами? Может ли это вызвать какое-то странное поведение? Может быть, он мог сдвигаться и толкаться одновременно и испортить массив? Это хороший способ сделать это? Есть ли лучшие способы?
Обновлено:
Причина, по которой я хочу это сделать. Это потому, что я хочу загрузить данные из разных ссылок. Итак, внутри моего скрипта я вызываю функцию загрузки (ссылки), но это приведет к тому, что скрипт попытается загрузить много ссылок одновременно. Поэтому я хочу создать буфер, чтобы скрипт загружался только по 100 ссылкам одновременно.
Внутри сценария я хочу вызвать загрузку (ссылку) везде, где захочу, а затем позволить интервалу позаботиться о загрузке только 100 ссылок одновременно. Таким образом, он удаляет 100 ссылок из буфера и загружает их. Пока скрипт проталкивает новые ссылки в тот же массив.
Меня больше всего беспокоит то, что пока я выполняю shift(), массив каким-то образом реорганизуется. Может ли js попытаться сделать push() между фазами реорганизации? Или js не будет выполнять какие-либо операции с массивом до тех пор, пока сдвиг() не будет завершен?
Было бы полезно узнать Зачем, что вы хотите сделать это, прежде чем мы сможем предложить альтернативу.
Хорошо, я обновил свой вопрос. Почему вы так уверены, что это вызовет странное поведение? Возможно, пока js выполняет метод shift(), он не будет выполнять какой-либо другой промежуточный метод, такой как push().



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваша общая идея асинхронно отправлять ссылки в массив, а затем удалять их из массива в отдельной асинхронной задаче прекрасна, она будет работать.
My main concern is that while i am doing a shift() the array will reorganize itself somehow. Might js try to make a push() in between this reorganization phase? Or will js not do any array operations on the array until shift() is completed?
Javascript является однопоточным, так что об этом не стоит беспокоиться — если один интервал запускает функцию, которая что-то делает, синхронные действия этой функции (например, манипулирование массивом) будут запускать к концу до того, как смогут выполняться любые другие обратные вызовы интервала.
Проблема общего изменяемого состояния является проблемой для многих других языков, но не для Javascript, по крайней мере, в большинстве случаев.
Тебе известно. Иногда мне интересно, человек ли ты вообще. Вы всегда онлайн, отвечаете на вопросы, и за последние десять месяцев у вас было почти 200+ представителей в день. Это впечатляет.
2 асинхронные функции в коде OP против 1 асинхронной функции в вашем. Типа бьет цель. Я лучше подожду, чтобы понять, чего на самом деле хочет OP, прежде чем предлагать
promiseилиasync/await.