2015-11-06 86 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,并使代码具有相当的描述性。