Javascript多个区间,带有返回promise的函数

时间:2016-08-24 07:41:02

标签: javascript promise setinterval

我有一个返回承诺的函数。我以一个间隔运行该函数,并在该承诺完成后,间隔停止。

我需要多次使用一个间隔调用此函数,这样在相关的promise完成后会有多个间隔要关闭。因此,将同时运行多个间隔并触发相同的功能。

如何构建一个在返回promise的相关函数完成后停止间隔的结构?

以下是适用于一个时间间隔的示例代码。

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);
            }

        }

2 个答案:

答案 0 :(得分:1)

据我所知,只有一个setInterval被清除。好的,我想举个例子。以下代码具有async函数,该函数首先回调数据和错误。它有望成为一个使数据返回一个承诺的函数。您应该在then阶段运行回调。

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

因此我们的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);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

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

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初始化。