Javascript 你为什么要把一个承诺包装在一个try/catch块中?

Javascript 你为什么要把一个承诺包装在一个try/catch块中?,javascript,asynchronous,promise,try-catch,Javascript,Asynchronous,Promise,Try Catch,我一直在阅读有说服力的JavaScript,尤其是。我基本上理解了,但其中一个例子让我不知所措。这是一个例子: function requestType(name, handler) { defineRequestType(name, (nest, content, source, callback) => { try { Promise.resolve(handler(nest, content, source

我一直在阅读有说服力的JavaScript,尤其是。我基本上理解了,但其中一个例子让我不知所措。这是一个例子:

function requestType(name, handler) {
  defineRequestType(name, (nest, content, source,
                           callback) => {
    try {
      Promise.resolve(handler(nest, content, source))
        .then(response => callback(null, response),
              failure => callback(failure));
    } catch (exception) {
      callback(exception);
    }
  });
}
我试图弄明白为什么作者将承诺包装在try/request块中。为了解释这一点,作者说:

请注意,对处理程序的调用必须包装在一个try块中,以确保它直接引发的任何异常都被赋予回调。这很好地说明了用原始回调正确处理错误的困难,很容易忘记正确路由异常,如果不这样做,故障将不会报告给正确的回调。承诺使这大部分是自动的,因此不容易出错

但这让我感到困惑,因为就在不久前,他说:

承诺让这变得更容易。可以解决(操作成功完成)或拒绝(操作失败)。只有当操作成功时,才会调用解析处理程序(注册于then),并且拒绝会自动传播到该操作返回的新承诺当处理程序抛出异常时,这会自动导致其then调用产生的承诺被拒绝。因此,如果异步操作链中的任何元素失败,整个链的结果将标记为拒绝,并且在失败点之外不会调用成功处理程序

那么,为什么我不能这样写:

function requestType(name, handler) {
  defineRequestType(name, (nest, content, source,
                           callback) => {
      Promise.resolve(handler(nest, content, source))
        .then(response => callback(null, response),
              failure => callback(failure));
        .catch(reason => callback(reason));
  });
}

它是否与作者使用
.then(响应,失败)
而不是
.then(响应).catch(失败)
有关?上面这个例子是为了处理成功、成功的交付和失败的响应(比如使用了不正确的请求类型),以及完全失败的交付,所以可能与此有关?我已经在这里读了几个其他类似的问题,但我仍在努力将其应用到这些示例中,因此非常感谢您的帮助。

请记住,
处理程序
函数是一个函数。 这意味着在将结果值传递给

处理程序
函数可以如下所示:

function handler(nest, content, source) { throw new Error(); }

因此,它甚至不会进入
Promise.resolve
中的“承诺世界”。这就是为什么需要使用try-catch构造。因此,无论什么失败(promise阶段或
处理程序
函数处理),都将由回调处理。

记住
处理程序
函数是一个函数。 这意味着在将结果值传递给

处理程序
函数可以如下所示:

function handler(nest, content, source) { throw new Error(); }

因此,它甚至不会进入
Promise.resolve
中的“承诺世界”。这就是为什么需要使用try-catch构造。因此,无论什么失败(promise阶段或
处理程序
函数处理),都将由回调处理。

谢谢。我认为,因为他说“当处理程序抛出异常时,这会自动导致其then调用生成的承诺被拒绝。”处理程序的异常会传递给
.then()
,因为它被包装在
promise.resolve()
中。但是,您所说的可能更符合这句话:“只有当操作成功时才会调用解析处理程序(注册于then)”,因此,当处理程序一开始不成功时,就没有
。then()
to
。catch()
关闭?是的。这是正确的思维方式。如果它立即抛出,则没有
然后
捕获
。谢谢。我认为,因为他说“当处理程序抛出异常时,这会自动导致其then调用生成的承诺被拒绝。”处理程序的异常会传递给
.then()
,因为它被包装在
promise.resolve()
中。但是,您所说的可能更符合这句话:“只有当操作成功时才会调用解析处理程序(注册于then)”,因此,当处理程序一开始不成功时,就没有
。then()
to
。catch()
关闭?是的。这是正确的思维方式。如果立即抛出,则不存在
then
catch
。本章含糊不清地使用了“handler”,这会引起混淆。“.Resolve handlers(注册于then)”只能有意义地引用一个函数,该函数是
then
调用的第一个参数,其返回值解析
then
调用本身返回的承诺。
Promise.resolve的参数列表中的
handler
函数调用不符合此定义。它作为一个参数值进行计算,在调用它之前传递给
Promise.resolve
。这是我见过的最奇怪的模式。从中学到的东西很少。你不太可能再看到它了,所以请绕开它。本章含糊不清地使用了“handler”,这会引起混乱。“.Resolve handlers(注册于then)”只能有意义地引用一个函数,该函数是
then
调用的第一个参数,其返回值解析
then
调用本身返回的承诺。
Promise.resolve的参数列表中的
handler
函数调用不符合此定义。它作为一个参数值进行计算,在调用它之前传递给
Promise.resolve
。这是我见过的最奇怪的模式。从中学到的东西很少。你不太可能再看到它了,所以别碰它。