将“错误”事件转换为本地异常

Converting 'error' events to local exceptions

提问人:Jason C 提问时间:6/26/2023 最后编辑:Jason C 更新时间:6/27/2023 访问量:31

问:

我正在使用 Node.JS 和提供事件的基于事件的 API(串行端口),我想通过当场抛出异常来处理错误。我明白这意味着我需要以更同步的方式做事。error

但是,我很难找到直接的方法来做到这一点。我想出如何做到这一点的唯一方法是使用中间承诺和 /,就像这个打开串行端口的例子一样(它有效但似乎是迂回的):asyncawait

import { SerialPort } from 'serialport';
import assert from 'node:assert';

// return port on success, throw something on error
async function openPort (path) {
    const p = new SerialPort({path:path,baudRate:9600});
    return await new Promise ((resolve, reject) => {
        p.once('open', () => resolve(p));
        p.once('error', e => reject(e));
    }).catch(e => {
        throw e;
    });
}

// synchronously open the port and handle resulting exception
let port;
try {
    port = await openPort('INVALIDPATH');
    assert(port);
    assert(port.port);
    assert(port.port.isOpen);
    console.log('port open');
} catch (e) {
    console.log('failed:', e);
}

// continue doing other stuff (errors are not fatal)
console.log('continuing to do other stuff...');

我有两个问题:

  1. 在处理事件时,是否有更直接的方法可以使事件引发异常?error
  2. 有没有办法做到以上,但打电话时不必使用?awaitopenPort()

顺便说一句,我想我在上面的代码中看到了一个错误,其中事件处理程序将在成功打开时保持附加状态,因此如果以后发生错误,它将返回并调用该过时的事件处理程序。我想避免这种情况,因为以后可能会发生其他事件,我也想处理。once('error',...)error

JavaScript node.js 异常 错误处理 事件处理

评论

1赞 kca 6/28/2023
国际海事组织,这里的承诺很好。有很多不同的方法可以走,但我不清楚你的代码到底是什么困扰着你。如果您只是觉得代码很麻烦,请尝试将事件处理程序函数提取到命名的本地函数中,然后尝试一下,看看它会将您引向何方。-- 您将需要调函数的 s 或嵌套,这两者都很好。-- 如果合适,有一些方法可以编写实用程序函数,例如将数组转换为顺序函数调用。await

答: 暂无答案