2016-03-01 45 views
3

我是新來的JavaScript承諾,但直接蝙蝠我注意到,如果你使用的承諾實現以外的瀏覽器提供的,有一些不同......突出的是Promise.cancel方法。承諾取消方法。爲什麼它尚未實現,而不是其他Promises框架?

這是可見的,當你使用鏈式承諾:

myPromise.then(this.view.firstMethod) 
      .then(this.view.secondMethod) // Fails, need to cancel the chain! 
      .then(this.view.thirdMethod) 
      .then(this.view.fourthMethod); 

使用WinJS.Promise取消鏈的承諾:https://jsbin.com/tuviqi/edit?js,console正確地顯示在控制檯:

0 
1 

使用Promise對象從瀏覽器取消相同的鏈接承諾:https://jsbin.com/morazi/edit?js,console並顯示

0 
1 
"Error in secondMethod." 
undefined 

我還使用catch這是ES6糖嘗試:https://jsbin.com/goqixal/edit?js,console - 但得到:

0 
1 
"Error in secondMethod." 
undefined     <--- jsbin doesn't show this, look into console 

我瀏覽到https://github.com/promises-aplus/cancellation-spec/issues/1 - 但爲什麼這個停頓是我不清楚。

當從瀏覽器中使用Promise我想鏈1,2和內部2鏈3,4?

回答

3

你很迷惑「取消」承諾並拒絕承諾。

這兩種情況告訴你是在一個重要的方面,這是在第二,你是在第三分支提供拒絕處理程序不同:

.then(this.view.thirdMethod, function(error) { console.warn(error); }) 
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

一旦這種拒絕處理程序執行,除非你重新 - 拋出錯誤,鏈回到「成功」路徑,這會導致第四個分支執行。但是,由於您從拒絕處理程序中不返回任何內容,因此傳遞給第四個處理程序的值未定義,這就是爲什麼要記錄到控制檯的原因。

「取消」承諾是ES語言組正在考慮的一個單獨的複雜主題。一種建議是here

相關問題