2015-11-06 91 views
2

我有一個jQuery承諾鏈,但是我想根據早期承諾的響應跳過其中一個承諾。根據響應跳過一個承諾鏈中的jQuery承諾

我的代碼是這樣的:

getMoney() 
    .then(getBeer) 
    .then(getFireworks) 
    .then(getLighterfluid) 
    .then(getCrazy); 

如果我getFireworks功能的承諾返回像「沒有可用的煙花」,然後我想跳過getLighterFluid承諾,並移動到getCrazy。

我如何用我當前的設置來解決這個問題?或者我需要重做嗎?

+1

'getLighterFluid'只能檢查是否有煙花。如果沒有,什麼都不要做。 – Oskar

+1

'.catch(getAmbulance)' – Bergi

回答

2

假設getFireworks解析爲[ { type: "rocket" } ]或類似,那麼getLighterFluid可能什麼也不做。

function getLighterFluid(fireworks) { 
    if (!fireworks.length) return; 

    //go get that lighter fluid 
} 
+0

類似但更全面的方法是使用提供給問題的任何解決方案[如何訪問.then()鏈中的先前承諾結果](http:// stackoverflow。 COM /問題/ 28250680 /如何-DO-存取先前的承諾,結果-IN-A-然後鏈)。這將允許您考慮所有/任何之前的異步結果。例如,您可以跟蹤每個階段剩餘的金錢數量並據此支出,或根據購買的啤酒和煙花的數量確定「getCrazy」的大小。 –

2

有很多方法可以解決這個問題,但基本上你必須改變鏈條結構或功能本身。

在這種情況下,我會敷getLighterfluid有這樣的幫手:

function conditionally(predicate, handler) { 
    return function(val) { 
    if(predicate(val) { 
     return handler(val); 
    } 
    }; 
} 

function notEqualFunc(val) { 
    return function(v) { 
    return v != val; 
    }; 
} 

getMoney() 
    .then(getBeer) 
    .then(getFireworks) 
    .then(conditionally(notEqualFunc('No fireworks available'), getLighterfluid)) 
    .then(getCrazy); 

,你可以:

getMoney() 
    .then(getBeer) 
    .then(getFireworks) 
    .then(function(val) { if(val != 'No fireworks available') return getLighterfluid(val); }) 
    .then(getCrazy); 

如果你需要經常使用它你可以概括這種模式創建您需要的任何謂詞原型而不是notEqualFunc,並使代碼具有相當的描述性。