Q - 链接同步的承诺,处理成功和失败

问题描述:

这应该是简单的,我希望..Q - 链接同步的承诺,处理成功和失败

我知道该怎么做基本的承诺链接:

main = function() { 
    returnsAPromise().then(function(data1) { 
    return augmentsAndReturnsTheData(data1); 
    }).then(function(data2) { 
    doesSomethingMeaningfulWithTheData(data2); 
    }); 
}; 

不过,说我想添加一些那种拦截,最后才处理,可以处理成功都和失败,如数据:

promisePrinter = function(promise) { 
    var bad, good; 

    good = function(data) { 
    console.log(['Success', data]); 
    return data; 
    }; 
    bad = function(data) { 
    console.log(['Failure', data]); 
    return data; 
    }; 
    return promise.then(good, bad); 
}; 

如何包括在我的柴N +尝试了几种不同的方式,但我似乎无法按照我的预期调用promisePrinter fn。

TIA!

+0

你期待什么? promisePrinter(主());应该吐出成功或失败。 – 2013-04-08 13:07:24

+0

我曾希望将promisePrinter添加到反对将承诺传递给它的链中。这样我就可以将它粘在承诺流程 – 2013-04-08 13:19:38

+0

中的任何位置,你可以将每个阶段包装在promisePrinter中,即{return promisePrinter(augmentsAndReturnsTheData(data1)); } – 2013-04-08 13:32:11

正如评论中指出的那样,如果要将其放入给定步骤中,则可以使用promisePrinter(main())return promisePrinter(augmentsAndReturnsTheData(data1))。有关于承诺样机这样做没有什么特别的方法,像有是thencatchfinally,因为你在这里做一个非常独特的操作:

  • 如果承诺履行(异步回),您登录成功,然后return通过。
  • 如果承诺拒绝(异步抛出),则记录错误,然后return从该错误中恢复。 (如果你想向前传递错误,你会重新抛出。)

现有finally是那种你想要什么,但并不真正适合,因为它传递的错误以后(如同步finally)和没有值或错误(如同步finally)。