无论承诺是否履行,如何执行相同的操作
How to perform same action regardless of promise fulfilment?
我想在承诺实现成功或失败后执行相同的操作,即我想对成功和错误处理程序执行相同的操作,然后继续将承诺的结果发送给相应的错误/成功处理程序。
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();
});
});
}
这有意义吗?
相关文章:
- 单击元素两次后执行操作
- 如何在mvc3中执行操作而不更改当前页面
- jQuery onunload在按下按钮时执行操作
- 如果DOM发生更改,您将如何执行操作
- 在执行所有回调函数后执行操作
- JavaScript 对输入框执行操作
- 如何根据各种复选框状态执行操作
- 对页面重新加载 Jquery 执行操作
- jQuery如果大于则执行操作,但只执行一次
- ngStorage是否异步执行操作
- 如何逐一执行操作
- 只有当输入文本是example.com这样的域时才执行操作
- Javascript数学不起作用,更好的方式来执行操作
- Qubit在控制台中执行操作
- 停止setInterval,直到未执行操作
- 我如何使用javascript对音频标记执行操作
- JS 函数将对象作为输入,并返回一个对象,该对象对作为参数传递的对象执行操作
- 单击时执行操作多个具有相同类的 href
- 在 JavaScript 中传递指定秒数后如何执行操作
- 如何在对用户控件执行操作后调用 Web 服务