提前返回异步函数

时间:2018-11-28 05:00:22

标签: javascript node.js asynchronous async-await

假设您必须调用异步函数,但是您对该函数的成功/失败情况并不真正感兴趣。在这种情况下,以下所述的两种模式相对于调用堆栈,回调队列和事件循环有什么优缺点

模式1

async setSomething() {
    try {
        set(); // another async function
    } catch (err) {
        // log the error here
    }
    return true;
}

模式2

async setSomething() {
    try {
        await set(); // another async function
    } catch (err) {
        // log the error here
    }
    return true;
}

2 个答案:

答案 0 :(得分:1)

模式1不会捕获set函数中异步操作期间可能发生的任何错误-任何错误都将导致未处理的Promise拒绝,应避免。模式1仅捕获在set同步操作期间发生的错误(例如,在设置fetch请求时),在大多数情况下不太可能发生

示例:

// open your browser's console to see the uncaught rejection

const set = () => new Promise((_, reject) => setTimeout(reject, 500));
async function setSomething() {
    try {
        set(); // another async function
    } catch (err) {
        console.log('err');
    }
    return true;
}

setSomething();

因此,模式2可能更可取。如果您不关心异步调用的结果,则不要await或在调用.then时调用setSomething()

或者,对于这种简单的事情,您可以考虑仅使用Promise方法,而无需使用async函数:

const setSomething = () => set()
  .catch((err) => {
    // log the error here
  });

答案 1 :(得分:0)

此答案是对问题的非常规建议,而不是对OP发布的示例的实际答案。

  

对该功能的成功/失败情况并不真正感兴趣

如果是上述情况,则意味着返回不依赖于异步调用的结果。

当您不担心异步调用的返回时,最好不要使用async/await或任何类型的promise。您可以像调用其他函数一样调用该函数,并使用其余代码进行处理。