2016-03-01 42 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

相关问题