2014-12-05 81 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