无论承诺履行如何,如何执行相同的操作?

时间:2014-12-05 16:12:44

标签: javascript promise winjs

我希望在承诺成功结果或失败后执行相同的操作,即我想为成功和错误处理程序执行相同的操作,然后继续发送承诺的结果适当的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

2 个答案:

答案 0 :(得分:1)

jfriend是对的,你通常需要finally - 它完全符合你上面的代码所做的。可悲的是WinJS承诺目前没有.finally功能,所以除非你想要它(在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);
});

答案 1 :(得分: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();
         });
     });
}

这有意义吗?