我有一个返回承诺的函数。我以一个间隔运行该函数,并在该承诺完成后,间隔停止。
我需要多次使用一个间隔调用此函数,这样在相关的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);
}
}
答案 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;
答案 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
初始化。