Разрешение обещания JS, которое передается в качестве параметра - PullRequest
1 голос
/ 19 апреля 2019

В моем 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
...