gpt4 book ai didi

javascript - 这个异常是如何处理的呢? (在 promise 内的回调中抛出)

转载 作者:太空宇宙 更新时间:2023-11-04 03:13:40 25 4
gpt4 key购买 nike

这个问题涉及一些nodejs代码。我试图理清思路,了解异常是如何处理的,以及 Promise/async 函数有何相似/不同之处。

我极大地简化了我的代码,在下面提供了一个(非功能性)示例。我有一个函数(uploadFile)返回一个 promise 。该函数调用另一个引发异常的异步函数。

const Linebyline = require('line-by-line');

const uploadFile = (filename) => new Promise((resolve, reject) => {
console.log(`Upload ${filename}`);
const lr = new Linebyline(filename);
//
// Point A: throw from here works, no unhandled rejection
//

lr.on('line', async (line) => {
// Another async function throws an error here,
// replacing it with a simple "throw" to clarify things:
throw new Error("failed");
// Point B: this throw fails, unhandled rejection
}

// Other code continues, calling resolve and reject...
}

async function top() {
try {
await uploadFile('test.txt');
} catch (err) {
console.log(`Err: ${err}`);
}
}

通过这个方案,我收到了未处理的拒绝。由于我在调用 uploadFile 的上层函数中有一个 try/catch,因此我希望该 catch 能够处理子调用中几乎所有发生的事情。

如果我捕获 uploadFile 中的“抛出”并将其转换为拒绝,那么一切都很好。

显然,不是调用reject,我是在自找麻烦,但我并不真正理解那个“抛出”生成的事件链?

谢谢。

<小时/>

编辑,2019 年 1 月 31 日

编辑源代码,概述核心问题。当我的函数从 B 点(回调内)抛出异常时,我最终会遇到未处理的拒绝。当从 A 抛出时,没有未处理的拒绝。

问题的核心实际上是从 B 点抛出的异常会发生什么。

此代码示例不会调用resolve/reject,但这是在实际代码中的其他地方完成的。

最佳答案

您错误地使用了 Promise 构造函数。您应该在出错时调用 reject 或在成功时调用 resolve。你两者都不做。如果您只是在 Promise 中调用 reject,那么 await 将抛出错误,这正是您在此处尝试实现的。

关于javascript - 这个异常是如何处理的呢? (在 promise 内的回调中抛出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59535580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com