在我的JS应用程序中,我需要在特定事件下下载多个(数百个)图像。事件一旦发生,所有图像都将进入队列并下载。由于Chrome和其他浏览器仅允许有限数量的并发下载,因此一次只能下载5个左右。其余的排队。
我的问题是,在下载图像时,用户可能会引发一个事件,该事件需要更高优先级的下载。但是,它被放入队列的末尾,并等待下载优先级较低的内容。
我决定实施自己的队列,在其中可以控制下载的优先级。当前,当引发该事件以下载低价图像时,在下载图像时会立即创建并解决数百个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