JavaScript promise : Reject handler vs catch

标签 javascript node.js promise

<分区>

我遇到过多个应用程序,其中使用 catch 优于 rejectHandler。 例如: 喜欢

new Promise.then(resolveHandler).catch()

代替

new Promise().then(resolveHandler, rejectHandler).catch()

这有什么特别的原因吗??

我找到了

new Promise().then(resolveHandler, rejectHandler).catch()

更有用因为

  1. 我可以使用 rejectHandler 解决调用 Promise.reject 的设计/预期错误场景。
  2. 我可以使用 catch block 来解决发生的未知/意外编程/运行时错误。

有人知道 rejectHandler 很少使用的任何特殊原因吗?

附言我知道 ES6 中有更新的替代方案,但我只是想知道这一点。

更新:我知道 rejectHandler 和 catch 是如何工作的。问题是为什么我看到更多人只使用 catch 而不是 rejectHandler 和 catch?这是最佳做法还是有一些优势?

更新(在此处添加答案):找到了我一直在寻找的第一手答案。 原因不仅仅是因为 reject 中的错误是由 catch 处理的,主要是因为链接。当我们链接 promise.then.then.then.then 时,有一个 resolve,reject 模式证明链接它有点棘手,因为您不想实现一个 rejecthandler 只是为了将 rejectData 转发到链上。仅使用 promise/then/catch 和 resolve/return/throw 证明在链接 N 个 thenable 时非常有用。 @Bob-Fanger(接受的答案)也解决了其中的一部分。 例如:

getData(id) {
        return service.getData().then(dataList => {
            const data = dataList.find(data => {
                return data.id === id;
            });
            if (!data) {
                // If I use Promise.reject here and use a reject handler in the parent then the parent might just be using the handler to route the error upwards in the chain
              //If I use Promise.reject here and parent doesn't use reject handler then it goes to catch which can be just achieved using throw.
                throw {
                    code: 404,
                    message: 'Data not present for this ID'
                };
            }
            return configuration;
        });
    }


//somewhere up the chain
....getConfiguration()
            .then(() => {
                //successful promise execution
            })
            .catch(err => {
                if (err.code) {
                    // checked exception
                    send(err);
                } else {
                    //unchecked exception
                    send({
                        code: 500,
                        message: `Internal Server error: ${err}`
                    });
                }
            });

仅使用这些我需要担心的是 promise/then/catch 以及链中任何位置的 resolve/return/throw。

最佳答案

不同之处在于,如果在 resolveHandler 内部发生错误,则 rejectHandler 不会处理它,后者只会处理原始 promise 中的拒绝。

rejectHandler 很少与 catch 结合使用,因为大多数时候我们只关心那个某事出错了。
只创建一个错误处理程序使代码更易于推理。

如果链中的特定 promise 应该以不同方式处理,这可能是使用 rejectHandler 的原因,但我可能会在其中编写一个 catch().then().catch()案例。

关于JavaScript promise : Reject handler vs catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52656159/

相关文章:

javascript - 无法获取下拉列表中所选项目的值

javascript - Jsp 属性按条件禁用

javascript - 如何导入 socket.io npm 包 - Node Js

javascript - 使用示例数据重新排列 json

javascript - Promise 中异步执行的代码在哪里?

javascript - Jasmine expect toThrow 不传也不接

javascript - app.use 在 promise 中(bookshelf.js 和express-basic-auth)

javascript - 单击时获取标记的 ID

javascript - 如何拒绝获取操作的访问

angularjs - Angular 应用程序在 Electron 中运行时会崩溃