2016-06-17 65 views
3

我有一個承諾P檢查服務器上的條件(電子郵件驗證)。ES6 - 繼續發出承諾,直到它解決沒有遞歸

P能夠既解決 - >電子郵件驗證

或失敗 - >與代碼的電子郵件未經驗證

或失敗 - >與其他代碼錯誤(電子郵件地址不存在等)

我想創建另一個承諾WaitP,它將等待P解決或以未驗證的電子郵件以外的代碼失敗。

所以WAITP做:

  1. 問題P

    如果P解決,解決WAITP

    如果P失敗代碼的電子郵件未經驗證,回去1(問題P再次)

    如果P使用郵件以外的代碼失敗未驗證,則失敗WaitP

我該如何寫這樣的承諾?

我希望有一個解決方案沒有遞歸。

thx!

+0

does [this](http://stackoverflow.com/questions/35791829/javascript-retry-promise-until-resolve/35792676#35792676)有幫助嗎? – georg

+0

你檢查了[這些](https://stackoverflow.com/search?q= [承諾] +重試)? – Bergi

+0

都使用遞歸,是否可以避免? – kofifus

回答

3

遞歸剛剛從catch處理程序中調用函數:

function waitP() { 
    return P().catch(function(err) { 
     if (err.code == "email unverified") 
      return waitP(); // try again 
     else 
      throw err; 
    }); 
} 

你可能想添加一個計數器或延遲遞歸調用,雖然,這樣你的過程不一樣,如果P()掛迅速和反覆無限失敗。

+0

是的,但我希望避免遞歸 – kofifus

+3

@kofifus:遞歸絕對沒有錯。異步回調中沒有堆棧。 – Bergi

+0

沒有堆棧?你怎麼能解釋?我認爲每個函數調用都會在堆棧上留下痕跡 – kofifus