我希望在承诺成功结果或失败后执行相同的操作,即我想为成功和错误处理程序执行相同的操作,然后继续发送承诺的结果适当的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 :(得分: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();
});
});
}
这有意义吗?