async/await 代码应该完全包含在 try 块中吗?

Should async/await code be entirely contained with try block?

我一直在阅读新的 async/await 并在 Node 8 中使用它。我遇到过一些人将所有内容都放在初始的 try 块中,并且其他人只有 await,其余的都在 try/catch 以下。这个比那个好吗?这是我自己的代码中的功能之一在两种风格中表达我的意思:

async function findCurrentInstallations() {
    try {
        const results = await installations.find({});

        if (results.length === 0) { throw new Error('No installations registered'); }
        return results;
    } catch (err) {
        throw err;
    }
}

--

async function findCurrentInstallations() {
    let results;

    try {
        results = await installations.find({});
    } catch (err) {
        throw err;
    }

    if (results.length === 0) { throw new Error('No installations registered'); }
    return results;
}

在您提供的示例中根本不需要 trycatch,这是 async 函数的默认行为。

你的两个代码片段的不同之处在于第一种情况下的 throw new Error(... 将由 catch 子句处理。但由于 catch 子句出于所有实际目的都是空操作,传递,所以它并不重要。

我会这样写:

async function findCurrentInstallations() {
    const results = await installations.find({});
    if (results.length === 0) { throw new Error('No installations registered'); }
    return results;
}

只包装 await,只会捕获等待失败引发的错误,如果代码中的任何一行失败,包装整个事情都会失败,这取决于您想要捕获的内容。

请注意,您只是抛出了示例,这是无用的,因为应用程序在失败时无论如何都会抛出。