承诺取消方法。与其他 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.