解决作为参数传递的JS Promise

时间:2019-04-19 19:07:39

标签: javascript promise es6-promise

在我的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

0 个答案:

没有答案