Javascript Promises:链接相同的承诺n次,然后做其他事情

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!解决!解决!解决!解决!

我做错了什么,我应该改变什么?

Jus*_*ijn 5

我认为您已经差不多完成了,但是您必须在函数的 then 块中再次返回 RepeatFunction 才能重复。

return functionToRepeat().then(function(){
    return repeatFunction(amount-1);
  });
}
Run Code Online (Sandbox Code Playgroud)

如果你有一个then,但不返回任何东西,那么它只会解决上面的承诺。这就是发生的事情。


Tom*_*lak 5

简单地说:

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)