javascript承诺onSuccess处理程序

时间:2014-11-08 19:01:41

标签: javascript promise q

是否存在一个处理程序方法,即失败的对应方式,类似于成功实现异步队列并继续正常的函数调用。

让我详细说明一下。让我们说

getConnection()
.then(function(connection){
     return self.getRecords() //some async routine, returns promise, does reject/resolve
})
.then(function(data){
     return self.getDetail() //some async routine, returns promise, does reject/resolve
})
.then(function(data){ //I'm done here calling onResult, but this onResult may call several
     self.onResult(data); //other functions down the road resulting in .fail() call
}) //I want to get out of this promise queue and continue with normal functions calls
.fail(function(info){
     self.onFault(info); //any error onFault causes down the road shouldn't be q problem.
})
.done(function(){ //but this gets called all the time at end no matter success or fail
      //release system resource like connection etc.
})

我试图在评论中解释这个问题,基本上我已经完成了self.getDetail()调用,一旦成功,我想退出承诺队列,原因,如果self.onResult(data)有一个问题方式之后,.fail()也会被触发,因为它依赖于那里。

我尝试将我的调用放入.done()方法,但无论成功或失败,done()都会被调用。

我有一个失败的例程被.fail()函数调用但不知道是否有成功处理程序。

任何横向思考的欢迎。

编辑 - 在Barmar的评论之后,我们可以这样做吗? (getConnection返回一个promise并拒绝/解析

connections.getConnection(function(c){
    return self.getMaster(c) //async routine, returns promise, does reject/resolve
}, function(info){
     self.onFault(info) //any failures in getMaster, any error in onFault shouldn't be q business
})
.then(function(data){
     return self.getDetail() //async routine, returns promise, does reject/resolve
 }), function(info){
     self.onFault(info)} //any failures in getDetail, any error in onFault shouldn't be q business
 })
.fail(function(info){ //btw any errors, onFault causes down the road shouldn't be q problem- same for above onFault calls
    self.onFault(info) //do I need this after above fail routines for each call?
 })
.done(function(){ //ok, once everything's done, get out of promise queue
     self.onResult(self.data) //any problem onResult causes down the road, should be it's own business
 }) //release routine

//异步队列,承诺链等中的两个独立函数。这些函数中的任何错误都不应影响promise的链或调用它的失败处理程序。承诺链应该在那里完成。

onResult: function(data) {
    console.log('do something with the data');
}

onFault: function(info) {
    console.log('wonder what went wrong');
}

请为上面的编辑建议

我的主要要求,任何事情都发生在onResult之后,onFault不应该是q库业务(fail),他们应该自己处理它(之后)

1 个答案:

答案 0 :(得分:2)

传递给then的第一个函数本身就是成功处理程序。

操作的返回值如: doSomething().then(function() { ... })新承诺,您可以随时将其保存在变量中,然后在以下位置使用多个独立的then调用:

var promise = someOperation().then(function(x) {
  return doSomethingWith(x);
});
promise.then(function(processedX) {
  // processedX is the return value of the function used to construct `promise`
  // now for something completely different
}
promise.then(someOtherFunction);

你不需要无限期地链接,你总是可以通过将中间新的promises存储到变量中并在其他地方使用它们(可能多次)来“脱离承诺链”,并创建几个独立的链。

通过这种方式,您可以将fail处理程序附加到一个链中的同一个承诺,并且在另一个链中没有附加到它。在您的情况下,您希望将整个链存储到变量中调用self.onResult的处理程序,对该变量使用fail处理程序,并使用相同的代码继续其余代码变量