2014-12-05 83 views
1

我希望在承诺成功或失败后执行相同的操作,即我想为成功和错误处理程序执行相同的操作,然后继续将承诺的结果发送给合适的erroe /成功处理程序。无论承诺履行如何执行相同的操作?

var pleaseWaitPromise = playAudioAsync("please wait"); 

myLongRunningPromise().then(function tempSuccessHandler(result) { 
    pleaseWaitPromise.cancel(); 
    return result; 
}, function tempErrorHandler(error) { 
    pleaseWaitPromise.cancel(); 
    return WinJS.Promise.wrapError(error); 
}).done(function realSuccessHandler(result) { 
    console.info(result); 
}, function realError(error) { 
    console.error(error); 
}); 

有没有更优雅的方式来阻止pleaseWaitPromise,这也可能是一个函数调用,而不是一个承诺(如clearInterval

+0

你不会说你正在使用的是什么Promise库,但是对于蓝鸟承诺库,无论承诺如何实现,你都可以使用'.finally()'来执行你想运行的动作。有关详细信息,请参见[https://github.com/petkaantonov/bluebird/blob/master/API.md#finallyfunction-handler---promise]。如我认为很明显的标签所描述的那样,WinJS是 – jfriend00 2014-12-05 18:47:33

+1

。 “最后”看起来只能在承诺链的最后。我希望它在链条的中间。 – philk 2014-12-05 23:11:11

+0

对于我们这些不认识winJS的人来说,我不清楚它是否有自己的诺言库(即使我在网上查到它)。如果你想从更大的社区获得帮助,最好在你的问题上更具体。像.finally()这样的所有非标准方法都是特定于库的,所以你必须看看winJS在这方面的作用。 – jfriend00 2014-12-05 23:12:36

回答

1

jfriend是正确的,你通常希望finally这里 - 它正是你的代码在上面做的。不幸的是,WinJS的承诺目前不具备0​​的功能,所以除非你想补充它(在WinJS.promise的原型上修补它),否则你就会陷入困境。

你也可以把它作为一个功能:

function always(prom, fn){ 
    return prom.then(function(v){ fn(v); return v; }, 
         function(e){ fn(e); return WinJS.Promise.wrapError(error); }); 
} 

将目光像:

always(myLongRunningPromise(), 
    pleaseWaitPromise.cancel(); 
})).done(function realSuccessHandler(result) { 
    console.info(result); 
}, function realError(error) { 
    console.error(error); 
}); 
+0

是的,像“WinJS.Promise.always”这样的猴子补丁应该很好。我尝试实现它。 – philk 2014-12-07 23:02:40

0

很抱歉,但我不明白的额外的步骤,不会这只是做你想要什么?

var pleaseWaitPromise = playAudioAsync("please wait"); 

myLongRunningPromise().then(function tempSuccessHandler(result) { 
    pleaseWaitPromise.cancel(); 
    console.info(result); 
}, function tempErrorHandler(error) { 
    pleaseWaitPromise.cancel(); 
    console.error(error); 
}); 

编辑:第二个尝试

我知道这是一个众所周知的反模式,但是如果你回到什么,从来没有失败一个承诺?例如:

function neverFails(myLongRunningPromise, pleaseWaitPromise){ 
    return new WinJS.Promise(function (complete){ 
     myLongRunningPromise().then(function() { 
      pleaseWaitPromise.cancel(); 
      console.info(result); 
      return complete(); 
     }, function (error) { 
      pleaseWaitPromise.cancel(); 
      console.error(error); 
      return complete(); 
     }); 
    }); 
} 

这有道理吗?

+0

在这种简单的情况下是的。但是我的诺言链要复杂得多。所以我需要尽早停止音频输出。就像@BenjaminGruenbaum建议的'finally'一样,但更像是在任何其他延续处理程序之前调用的'first'。 – philk 2014-12-07 23:00:38

+0

添加了新的场景,让我知道它是否有帮助(或不) – sebagomez 2014-12-08 02:45:49

+0

感谢您的努力。它似乎可以工作*如果错误处理程序也重新抛出错误条件(或修改后的错误)。我只是不喜欢这个解决方案强加的调用约定。我向WinJS git回购提交了一个问题,也许这些人有一个聪明的想法。再次感谢! – philk 2014-12-08 09:56:37