首页 > 解决方案 > 我应该总是“等待”每一个承诺吗?

问题描述

我很难找到最近困扰我的问题的答案。我应该永远await信守承诺吗?

我是什么意思?

假设我有一个返回承诺的函数,但我没有对从该承诺返回的值做任何事情。我还应该等待吗?还是我应该把它留在尝试捕获中

我应该等待返回 Promise 的函数吗?


const specialFunction = async () => {

  try {
    await handleEventsInsertion(body)
  } catch (error) {
    logger.error(error)
  }

}

handleEventsInsertion方法是将事件实际插入数据库的方法。但我没有对这个方法返回的承诺做任何事情。所以我应该等待吗?如果存在拒绝,则会导致未处理的拒绝

有没有我不应该await承诺的情况?

标签: javascriptnode.js

解决方案


不,你并不总是需要await承诺。但是,为了确保正确的应用程序流程,您应该随时准备好处理发生的任何错误。

如果你不await承诺,你应该实现catch回调。因此,无论是您在问题中编写的代码,还是类似于以下内容的代码:

const specialFunction = () => {
    handleEventInsertion(body)
        .catch(error => {
            logger.error(error);
        });
}

您可以选择不这样做,但正如您已经说过的那样:如果发生错误而您没有try//承诺或await错误,它将被视为未处理的拒绝。catch.catch

编辑:

至于您的另一个问题:是否存在您不应该等待承诺的情况?

是的。如果您正在响应需要在触发可能需要一段时间后立即报告的用户操作,您希望异步处理该操作并且您不想等待它完成。但是,在这种情况下,您调用的异步函数应该处理错误。举个例子:

const onClick = () => {
    handleEventInsertion(body);  // asynchronous function
    alert("Thanks, we'll take it from here");
};

const handleEventInsertion = async (body) => {
    try {
        const result = await performLengthyAsyncOperation(body);
        alert(`${result} inserted successfully`);
    } catch (error) {
        logger.error(error);
    }

    // or using the callbacks instead of try/await/catch:
    performLengthyAsyncOperation(body)
        .then(result => {
            alert(`${result} inserted successfully`);
        }).catch(error => {
            logger.error(error);
        });
};

编辑 2

如果您出于某种原因真的不想使用await,还有一个替代解决方案:您可以捕获未处理的拒绝错误。

window.onunhandledrejection = (error) => {
    logger.error(error);
};

如果你这样做,如果处理总是相同的,你就不需要到处捕捉错误。await在这种情况下,只有当您需要函数的结果或特定错误需要特殊处理时,您才会做出承诺。


推荐阅读