我有一个承诺返回函数,它做了一些异步的东西,让我们称之为 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!");
})
这成功地链接了我的承诺(或者接缝,我在控制台中每秒得到一个"resolved!") . 然而_1124175_我试图在我的 repeatFunction(5)
发生在第一个承诺结束后发生,而不是在所有5个结束之后!
所以在我的控制台中,我得到:
解决! DONE!解决!解决!解决!解决!
我做错了什么,我应该改变什么?
7 回答
我认为你几乎就在那里,但是你必须在你的函数的then块中再次返回repeatFunction来重复 .
如果你有
then
,但不返回任何东西,那么它只会解决上层承诺 . 这就是发生的事情 .怎么样简单:
用这个测试:
此输出产生超过5秒:
当你拨打
repeatFunction(amount-1)
时,你错过了return
https://plnkr.co/edit/93T6B4QkBv0mYS4xPw0a?p=preview
你可能会发现relign对这类事情很有用 . 这是你用relign series和relign setTimeout写的例子 .
我想要类似的东西,所以我在(https://repl.it/@turlockmike/BriskLovableLinuxkernel)写了一个通用函数
用法
你可以使用
async
/await
和一个简单的while
循环 . 这使您保持Asyncland允许您在重复功能完成后继续链接这是垃圾桶 . 您只能使用副作用函数作为
asyncRepeat
的f
参数 . 因此,登录控制台可以正常工作,但如果您真的想要使用该值执行某些操作,该怎么办?这是对
asyncRepeat
的更新,它允许您通过重复应用输入函数来线程化值(在此示例中为asyncDouble
)( bold 中的重要变化)
其中
n
是迭代次数,f
是要调用的Promise返回函数 . 对f
的每次连续调用在结算时都会传递上一次调用的结果 .例如...