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 之间的随机 dur
ation 值。
所以我们的 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);
我有一个 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 之间的随机 dur
ation 值。
所以我们的 intervalPromises
函数将每 100 毫秒产生一个承诺,并且承诺最早解决或拒绝是 500 毫秒。因此,在我们有机会停止 setInterval
.
好的,看看吧。
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);