Glo*_*omy 5 javascript promise es6-promise
我有一个promise-returns函数,可以执行一些异步操作,让我们调用它functionToRepeat().
我正在尝试编写该函数repeatFunction(amount),以便它将启动承诺,等待完成,再次启动它,等待完成,等等一定时间.这repeatFunction(amount)也应该是可以的,以便我可以在执行后链接其他东西.
这是我的尝试:
function functionToRepeat(){
let action = new Promise(function(resolve,reject){
setTimeout(function(){
console.log("resolved!");
resolve()}
,1000);
})
return action
}
function repeatFunction(amount) {
if(amount==0){
return Promise.resolve();
}
return functionToRepeat().then(function(){
repeatFunction(amount-1);
});
}
repeatFunction(5).then(function(){
console.log("DONE!");
})
Run Code Online (Sandbox Code Playgroud)
这成功地链接了我的承诺(或者接缝,我在控制台中每秒得到一个"解决!").然而,在第一个承诺结束.then()后,我试图在我repeatFunction(5)发生之后链接,而不是在所有5个结束之后!
所以在我的控制台中,我得到:
解决!DONE!解决!解决!解决!解决!
我做错了什么,我应该改变什么?
我认为您已经差不多完成了,但是您必须在函数的 then 块中再次返回 RepeatFunction 才能重复。
return functionToRepeat().then(function(){
return repeatFunction(amount-1);
});
}
Run Code Online (Sandbox Code Playgroud)
如果你有一个then,但不返回任何东西,那么它只会解决上面的承诺。这就是发生的事情。
简单地说:
function repeat(func, times) {
var promise = Promise.resolve();
while (times-- > 0) promise = promise.then(func);
return promise;
}
Run Code Online (Sandbox Code Playgroud)
当用这个测试时:
function oneSecond() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("tick");
resolve();
}, 1000);
});
}
repeat(oneSecond, 5).then(function () {
console.log("done");
});
Run Code Online (Sandbox Code Playgroud)
这个输出是在 5 秒内产生的:
tick
tick
tick
tick
tick
done
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3392 次 |
| 最近记录: |