В моем JS-приложении мне нужно загрузить несколько (сотни) изображений для определенного события. Как только событие происходит, все изображения в очереди и загружаются. Поскольку Chrome и другие браузеры допускают только ограниченное количество одновременных загрузок, загружаются одновременно только 5 или около того. остальные ставятся в очередь.
Моя проблема в том, что во время загрузки изображений пользователь может вызвать событие, которое потребует более высокого приоритета загрузки. Но он помещается в конец очереди и ожидает загрузки материала с более низким приоритетом.
Я решил создать свою собственную очередь, где я могу контролировать приоритет своих загрузок. В настоящее время, когда возникает событие для загрузки изображений с низким значением pr, сотни обещаний fetch
немедленно создаются и разрешаются при загрузке изображений.
Вместо того, чтобы возвращать обещание получения (которое будет выполнено сразу), я хочу вернуть обещание, которое может быть выполнено позже. Затем передайте это обещание моей функции очередей и дайте ей решить, когда ее решить.
Вот как инициируется звонок:
static addCall(params) {
let returnPromise = new Promise((resolve, reject) => { });
let CallParams = {
Promise: returnPromise,
}
//push call in a queue
Backend.CallQueue.push(CallParams);
//run queue
Backend.enforceQueue();
return returnPromise;
}
Это моя очередь:
static ConcurrentCallsLimit = 3;
static CallQueue = [];
static RunningCalls = [];
static enforceQueue() {
//If currently running less concurrent calls then a maximum allowed - add more
if (Backend.RunningCalls.length < Backend.ConcurrentCallsLimit) {
for (let i = 0; i < Backend.ConcurrentCallsLimit - Backend.RunningCalls.length; i++) {
let nextCall = Backend.CallQueue.shift();
if (nextCall) {
//push in line & run
Backend.RunningCalls.push(nextCall);
Backend.runCall(nextCall);
}
}
}
}
И метод RunCall: (пытается разрешить обещание, переданное в качестве параметра)
static runCall(CallParams){
fetch("path", {...})
.then((resp)=>{
CallParams.Promise.resolve(resp); //this will not work :(
});
}
//CallParams.Promise.resolve is not a function