Javascript 仅当函数已运行10次时,才转至下一步
我有这个功能:Javascript 仅当函数已运行10次时,才转至下一步,javascript,typescript,promise,rxjs,Javascript,Typescript,Promise,Rxjs,我有这个功能: function setIntervalX(callback, delay, repetitions): Promise<any> { let promises = []; var x = 0; var intervalID = window.setInterval(function () { callback(); if (++x === repetitions) { window.clearInterval(interval
function setIntervalX(callback, delay, repetitions): Promise<any> {
let promises = [];
var x = 0;
var intervalID = window.setInterval(function () {
callback();
if (++x === repetitions) {
window.clearInterval(intervalID);
promises.push(new Promise((resolve, reject) => {});
}
}, delay);
return Promise.all(promises);
}
我觉得我这样做的方式很丑陋,可以做得更好。有什么建议吗?除非你需要单独的承诺(除了在
承诺中,你从不使用上面的承诺。所有的),只要使用一个承诺:
function setIntervalX(callback, delay, repetitions): Promise<any> {
return new Promise(resolve => {
let x = 0;
let intervalID = window.setInterval(function () {
callback();
if (++x === repetitions) {
window.clearInterval(intervalID);
resolve();
}
}, delay);
});
}
函数setIntervalX(回调、延迟、重复):承诺{
返回新承诺(解决=>{
设x=0;
让intervalID=window.setInterval(函数(){
回调();
如果(++x==重复次数){
窗口。clearInterval(intervalID);
解决();
}
},延误);
});
}
您也标记了RxJS,因此我将抛出一个Rx解决方案
function setIntervalX(callback, delay, repetitions): Observable<any> {
//Emit an event every delay
return Rx.Observable.interval(delay)
//Only accept a certain number of events
.take(repetitions)
// Process the callback each time
.do(() => callback())
// Convert the result into a promise
.toPromise();
}
setIntervalX(() => {
//logic here
}, 1000, 10)
.then(() => {
expect(something).toBe(anotherThing);
});
函数setIntervalX(回调、延迟、重复):可观察{
//每个延迟发出一个事件
返回接收可观测间隔(延迟)
//只接受一定数量的事件
.进行(重复)
//每次处理回调
.do(()=>callback())
//将结果转化为承诺
.toPromise();
}
setIntervalX(()=>{
//这里的逻辑
}, 1000, 10)
.然后(()=>{
期望(某物)成为(另一物);
});
您想要更优雅的解决方案,这是怎么回事:
var wait=ms=>newpromise(resolve=>setTimeout(resolve,ms));
让setIntervalX=(cb、延迟、重复)=>
all(数组(reps).fill().map((n,i)=>wait(delay*(i+1)).then(cb));
//演示:
让test=()=>Promise.resolve(),然后(()=>(console.log(“test”),“!”);
setIntervalX(test,1000,10).then(results=>console.log(results.join(“”))代码>好的,我重新格式化了,你现在能帮我吗:)?恕我直言,但请看上面的内容。你真的会称之为“一致且可读”的格式吗<代码>回调
在第一个代码块中未对齐,这会产生误导;第一个块在其他方面仍然具有不一致的缩进特征;对第二个代码块说得越少越好。让你的文章和代码清晰明了,并证明你花了时间这样做,可以提高你获得好答案的机会。如果这是一个测试,为什么你要以1秒的间隔将它们隔开,而不是背靠背地运行它们?您的问题还不清楚回调
是否会返回承诺,即有效地表示异步操作,以及执行所需时间是否少于一秒钟(意味着测试按顺序执行),或者更多(它们最终并发执行,即并行执行)。澄清这一点可能会使问题变得更好。你所说的“通话已结束”是什么意思?如果您只是想在第10次呼叫被触发后继续,那么setTimeout(大约10000)
似乎就足够了。很好,但它仍然不够优雅,可以做得更好吗?@JerzyGruszka:除了删除不必要的窗口。
在计时器功能上,我不确定您还会做什么。@T.J.Crowder如果callback()抛出或返回被拒绝的承诺,则无法正确传播错误。@jib:我只是在解决实际问题,没有做代码复查。
function setIntervalX(callback, delay, repetitions): Observable<any> {
//Emit an event every delay
return Rx.Observable.interval(delay)
//Only accept a certain number of events
.take(repetitions)
// Process the callback each time
.do(() => callback())
// Convert the result into a promise
.toPromise();
}
setIntervalX(() => {
//logic here
}, 1000, 10)
.then(() => {
expect(something).toBe(anotherThing);
});