я для похожих задач делал свой скромный костыль:
пример// класс для очереди
class Queue{
constructor(interval=1000) {
this.list = [];
setInterval(()=>{
const item = this.list.shift();
if( item && item.cb && typeof item.cb === "function" ){
item.cb(...item.params);
}
},interval);
}
addTask(cb, ...params){
this.list.push({cb:cb, params:params});
}
}
// экземпляр класса для очеред. устанавливаем интервал срабатывания 2 секунды
const queue = new Queue(2000);
// links - ваш мап
links.forEach(b => {
// хз как вы используете b, в вашем коде это не показано
queue.addTask(()=>{
// но вы вполне можете использовать ваше b тут
fetchDonor();
});
});
но данный вариант не гарантирует строгую очередность выполнения запросов. Могу легко показать, как сделать тоже самое, но с гарантией соблюдения последовательности вызовов, но для этого
fetchDonor();
должен либо отдавать промис, либо принимать колбэк, который будет выполнятся по завершении работы
fetchDonor();
PS: исправил опечатку в коде