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

How to perform same action regardless of promise fulfilment?

本文关键字:执行 操作 何执行 是否 承诺      更新时间:2023-09-26

我想在承诺实现成功或失败后执行相同的操作,即我想对成功和错误处理程序执行相同的操作,然后继续将承诺的结果发送给相应的错误/成功处理程序。

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

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);
});

对不起,但我不明白额外的步骤,这不会只是你想要的吗?

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();
         });
     });
}

这有意义吗?