簡體   English   中英

如何遞歸調用promise函數

[英]How to call promise function recursively

我試圖使用javascript promises遞歸調用異步函數,但沒有找到一個有效的模式。

這是我想象的工作方式:

var doAsyncThing = function(lastId){
  new Promise(function(resolve, reject){
    // async request with lastId
    return resolve(response)
  }
}

var recursivelyDoAsyncThing = function(lastId){
  doAsyncThing(lastId).then(function(response){
    return new Promise(function(resolve, reject){
      //do something with response
      if(response.hasMore){
        //get newlastId
        return resolve(recursivelyDoAsyncThing(newLastId));
      }else{
        resolve();
      }
    });
  });
}

recursivelyDoAsyncThing().then( function(){
  console.log('done');
});

為什么這不起作用? 我誤解了什么?

有沒有更好的模式來解決這個問題?

recursivelyDoAsyncThing需要返回Promise才能繼續鏈。 在您的情況下,您需要做的就是讓doAsyncThing返回其Promise:

var doAsyncThing = function(lastId){
  // Notice the return here:
  return new Promise(function(resolve, reject){

然后將returndoAsyncThing調用,如下所示:

var recursivelyDoAsyncThing = function(lastId){
  // Notice the return here:
  return doAsyncThing(lastId).then(function(response){

你在recursivelyDoAsyncThing函數中錯過了一個return 你也應該避免使用Promise構造函數反模式

function recursivelyDoAsyncThing(lastId) {
  return doAsyncThing(lastId).then(function(response) {
//^^^^^^
    //do something with response
    if (response.hasMore) {
      //get newlastId
      return recursivelyDoAsyncThing(newLastId);
    } else {
      return; // undefined? Always return a useful value
    }
  });
}

我有一個簡單的遞歸承諾的例子。 該示例基於數字的計算factorial

 let code = (function(){ let getFactorial = n =>{ return new Promise((resolve,reject)=>{ if(n<=1){ resolve(1); } resolve( getFactorial(n-1).then(fact => { return fact * n; }) ) }); } return { factorial: function(number){ getFactorial(number).then( response => console.log(response) ) } } })(); code.factorial(5); code.factorial(6); code.factorial(7); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM