Javascript 具有 return 承诺的功能的多个区间

Javascript multiple intervals with function that return promise

我有一个 return 承诺的功能。我 运行 该函数有一个间隔,并且在该承诺完成间隔后停止。

我需要多次使用一个interval来调用这个函数,所以在相关的promise完成后会有多个interval被关闭。所以会有多个区间运行ning同时触发同一个函数。

如何构建一个结构,在其相关函数 return 承诺完成后停止间隔?

这是一个适用于一个区间的示例代码。

function startInterval(){
    ir.intervalVariable=$interval(function() {checkFinishedJob(jobNumber}, 2000);
}

function checkFinishedJob(jobNumber){
            // check if the job which is identified with jobNumber is finished
            if(isJobfinished==true){    
                $interval.cancel(ir.intervalVariable);
            }

        }

让我们考虑一下这个原型:

function IntervalFunction(params) {
    if (!IntervalFunction.intervals[params.key]) {
        IntervalFunction.intervals[params.key] = [];
    }
    IntervalFunction.intervals[params.key].push(setInterval(function() {
        if (params.executed()) {
            for (var intervalIndex in IntervalFunction.intervals[params.key]) {
                clearInterval(IntervalFunction.intervals[intervalIndex]);
            }
            IntervalFunction.intervals = [];
        }
    }, params.interval));
}
IntervalFunction.intervals = {};

执行回调以设置由 params.executed() 选中的标志到 true。该标志应由 false.

初始化

据我所知,只有一个 setInterval 需要清除。好的,我想举个例子。下面的代码有一个 async 函数,它首先接收数据和错误回调。它被承诺成为一个接受数据 returns 承诺的函数。您应该 运行 在 then 阶段进行回调。

我们有另一个函数利用 setInterval 来调用我们的 promisifiedAsync 函数和一些数据对象,例如 {val:0, dur:1723}。好的,我们还有一个生成器函数来为我们提供数据。每次请求数据时,它都会提供 val 比之前多 1 和 500 - 2000 之间的随机 duration 值。

所以我们的 intervalPromises 函数将每 100 毫秒产生一个承诺,并且承诺最早解决或拒绝是 500 毫秒。因此,在我们有机会停止 setInterval.

之前,我们将至少有 5 个承诺。

好的,看看吧。

function* generateData(){
  var i = 0;
  while (true) yield {val: i++, dur:Math.floor(Math.random()*1500)+500};
}

function promisify(fun){
  return (data) => new Promise((resolve,reject) => fun(data, (err,res) => err ? reject(err) : resolve(res)));
}

function async(data, callback){
  Math.random() < 0.5 ? setTimeout(_ => callback(false,data.val),data.dur)
                      : setTimeout(_ => callback("error at " + data.val),data.dur);
}

function myCallback(err,val){
  return err ? (console.log("failed with:", err), err)
             : (console.log("resolved with:",val), val);
}


function intervalPromises(fun, callback){
  var sid = setInterval(_ => {var data = giveMeData.next().value;
                              console.log("data to be processed asyncronously is:", data);
                              fun(data)
                              .then(val => {clearInterval(sid);
                                            callback(false,val);
                                            })
                              .catch(err => {clearInterval(sid);
                                            callback(err);
                                            });
                             }, 100);
}

var promisifiedAsync = promisify(async),
          giveMeData = generateData();
intervalPromises(promisifiedAsync,myCallback);