2017-01-30 368 views
-1

我正試圖在我的promise中創建一些嵌套的'while'循環。當我執行log.asyncCall().then(...)時,我開始遇到麻煩,我的IDE馬上告訴我,箭頭功能將直接跳轉到.then(),其中包含return innerFunc(),甚至沒有進入if statement。我認爲競賽條件並未按照我希望的順序執行。在promise中執行嵌套'while'循環

總結什麼,我想實現:

根據outerFunc我想執行innerFunc這3次。

什麼innerFunc確實一次又一次地呼叫.asyncCall()只要log不是null。如果innerFunc無法生成log,請退出'while'循環。

我也很難找到調試承諾的好方法。我目前使用WebStorm的調試功能。

var i = 0 
const outerFunc =() => { 
    return new Promise(resolve => { 
    if (i < 3) { 
     i++ 
     const innerFunc =() => { 
     return new Promise(resolve => { 
      return log.asyncCall().then(lg => { 
      if (lg) { 
       // some logic 
      } else { 
       resolve() 
      } 
      }).then(() => { 
      // continue iterating innerFunc() 
      return innerFunc(); 
      }); 
     }) 
     }; 
     // first iteration innerFunc() 
     return innerFunc().then(() => { 
     // once innerFunc() is complete, reiterate outerFunc() 
     return outerFunc(); 
     }); 
    } else { 
     resolve(); 
    } 
    }); 
} 
+1

注意:'。然後(()=> {返回innerFunc()})'是更好地寫成'.then(innerFunc)' – Alnitak

+1

另外,你是否期待'log.asyncCall'中使用的'log'變量具有從前一次迭代中收到的值? (它沒有) – Alnitak

+0

@Alnitak對不起,不好的選擇變量名 – Liondancer

回答

1

您正在使用Promise反模式,因爲您將承諾包裝在另一個承諾中。

我會強烈建議採取innerFunc從內範圍,從而改寫它:

const doLogging =() => { 
    return log.asyncCall().then(result => { 
     if (result) { 
      // do stuff 
      ... 
      return doLogging(); 
     } 
    }); 
} 

沒有必要爲else分支 - 內箭頭功能將隱式返回undefined將隨後被包裹.then成爲承諾。

然後,您要運行該count時間:

const repeatPromise = (f, count) => { 
    if (count > 0) { 
     return f().then(() => repeatPromise(f, count - 1)); 
    } else { 
     return Promise.resolve(); 
    } 
} 

const outerFunc =() => repeatPromise(doLogging, 3); 

在此功能的else分支是必要的,以確保最終的結果是永遠的承諾。

(注:書面如果傳遞函數不返回一個無極的repeatPromise功能將無法正常工作)

+0

@Liondancer我沒有足夠的去那裏。 FWIW,我確實寫了一些node.js代碼來測試我上面寫的東西,它都可以工作。 – Alnitak