![](/img/trans.png)
[英]Why would you try-catch around a promise? Does that catch the promise's error?
[英]Why would you wrap a Promise in a try/catch block?
我一直在阅读 Eloquent 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);
}
});
}
我试图弄清楚为什么作者将 Promise 包装在 try/request 块中。 为了解释它,作者这样说:
请注意,对处理程序的调用必须包装在 try 块中,以确保将其直接引发的任何异常都提供给回调。 这很好地说明了使用原始回调正确处理错误的难度——很容易忘记正确路由这样的异常,如果你不这样做,故障将不会被报告给正确的回调。 Promise 使这大部分是自动的,因此不易出错。
但这让我感到困惑,因为就在不久之前,他说:
Promise 使这更容易。 它们可以被解决(操作成功完成)或被拒绝(失败)。 仅当操作成功时才调用解析处理程序(与 then 注册的),并且拒绝会自动传播到此时返回的新 promise。 当处理程序抛出异常时,这会自动导致其 then 调用生成的 promise 被拒绝。 因此,如果异步操作链中的任何元素失败,则整个链的结果将被标记为被拒绝,并且在失败点之外不会调用任何成功处理程序。
那么为什么我不能把它写成:
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(response, failure)
而不是.then(response).catch(failure)
的作者有关吗? 上面这个例子是为了处理成功、失败响应的成功交付(比如使用了不正确的请求类型)和完全失败的交付,所以也许与此有关? 我在这里阅读了其他几个类似的问题,但我仍在努力将其应用于这些示例,因此非常感谢任何帮助。
请记住, handler
function 是 function。 这意味着在将结果值传递给Promise.resolve
之前调用和处理它
handler
function 可能如下所示:
function handler(nest, content, source) { throw new Error(); }
因此,它甚至不会 go 到Promise.resolve
中的“承诺世界”。 这就是为什么需要使用 try-catch 构造的原因。 所以无论失败(promise 阶段或handler
function 处理),它将由回调处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.