承诺取消方法。与其他 Promises 框架相比,为什么它尚未实现?
Promises cancel method. Why it's not implemented yet as opposed to other Promises frameworks?
我是 JavaScript 中的 promises 的新手,但我已经注意到,如果您使用浏览器提供的 promise 实现以外的 promise 实现,则会存在一些差异......并且其中最突出的是 Promise.cancel
方法。
这在您使用链式承诺时可见:
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?
您混淆了 "cancelling" 承诺和 "rejecting" 承诺。
您展示的两个案例在一个重要方面有所不同,即在第二个案例中,您在第三个分支上提供了拒绝处理程序:
.then(this.view.thirdMethod, function(error) { console.warn(error); })
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
一旦执行此拒绝处理程序,除非您重新抛出错误,否则链会返回到 "success" 路径,这会导致执行第四个分支。但是,由于您 return 拒绝处理程序中没有任何内容,因此传递给第四个处理程序的值是未定义的,这就是将其记录到控制台的原因。
"Cancelling" promises 是一个单独的、复杂的主题,ES 语言组正在考虑该主题。一项提案是 here.
我是 JavaScript 中的 promises 的新手,但我已经注意到,如果您使用浏览器提供的 promise 实现以外的 promise 实现,则会存在一些差异......并且其中最突出的是 Promise.cancel
方法。
这在您使用链式承诺时可见:
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?
您混淆了 "cancelling" 承诺和 "rejecting" 承诺。
您展示的两个案例在一个重要方面有所不同,即在第二个案例中,您在第三个分支上提供了拒绝处理程序:
.then(this.view.thirdMethod, function(error) { console.warn(error); })
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
一旦执行此拒绝处理程序,除非您重新抛出错误,否则链会返回到 "success" 路径,这会导致执行第四个分支。但是,由于您 return 拒绝处理程序中没有任何内容,因此传递给第四个处理程序的值是未定义的,这就是将其记录到控制台的原因。
"Cancelling" promises 是一个单独的、复杂的主题,ES 语言组正在考虑该主题。一项提案是 here.