使用Promises处理分支

时间:2013-03-20 21:10:14

标签: javascript jquery asynchronous promise

我有jQuery 1.9.1 promises的问题,我可能需要条件逻辑,它将返回另一个延迟,我不知道如何处理它。这是我最好的尝试,但正如下面的评论所示,当我点击其他分支时,我仍然按下第二个.then()函数,我希望我可以回到用户。有关如何处理这种情况的任何模式?

storage.provision(c)

.then(function(rc){
    if(rc === 0){
        storage.write(c);
    }else{
        return options.onSuccess(rc); //how i got back to the users callbacks/promise, but this
        //takes me to the .then below
    }
})
 //storage.write returns a promise as well, do I do another .then 
// like this?
.then(function(rc){
    //I was hoping this would catch, the storage.write() case, and it does, but it also catches
    //the retun options.onSuccess(rc) in the else case.
    options.onSuccess(rc);
})


.fail(function(e){
    //handle error using .reject()
});

1 个答案:

答案 0 :(得分:4)

通过认为options.onSuccess(rc);在第二个.then()中无条件执行但从不在第一个.then()中执行,这变得更加容易。

因此,第一个rc必须传递rc === 0

  • if storage.write(c),以回复rc !== 0完成
  • 或立即.then()

done对此非常方便,因为它自然允许从其storage.provision(c).then(function(rc) { if(rc === 0) { var dfrd = $.Deferred(); storage.write(c).done(function() { dfrd.resolve(rc); }).fail(dfrd.fail); return dfrd.promise(); } else { return rc;//pass on rc to the second .then() } }).then(function(rc){ options.onSuccess(rc); }).fail(function(e){ //handle error using .reject() }); 回调中返回新Promise的值。

rc === 0

我确信存在其他方法,但这是我能想到的最接近你原始概念的方法。

rc时不必创建新的Deferred会很好,但这是传递storage.write()的最现实的方法,因此无需修改{{1}}以表现在此方式。