我应该总是在每一个诺言上“等待”吗?

时间:2020-10-03 11:50:13

标签: javascript node.js

我很难找到有关最近困扰我的问题的答案。 我应该总是await信守诺言吗?

我的意思是什么?

比方说,我有一个函数返回一个诺言,但是我没有用该诺言返回的值做任何事情。我还应该等待吗?还是应该将其保留在尝试范围内

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


const specialFunction = async () => {

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

}

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

是否存在我不应该承诺await的情况?

1 个答案:

答案 0 :(得分:6)

不,您不必总是await承诺。但是,为了确保正确的应用程序流程,您应该始终准备好处理发生的任何错误。

如果您没有await承诺,则应该实现catch回调。因此,要么是您在问题中编写的代码,要么是类似以下内容的

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

您可以选择不这样做,但是正如您已经指出的那样:如果发生错误并且您没有try / await / catch或{{1 }}错误,它将被视为未处理的拒绝。

编辑:

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

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

.catch

编辑2

如果出于某种原因,您真的根本不想使用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); }); }; ,则有另一种解决方案:您可以捕获未处理的拒绝错误。

await

如果执行此操作,则在处理总是相同的情况下,无需到处捕获错误。在这种情况下,如果您需要函数的结果或特定错误需要特殊对待,则只会window.onunhandledrejection = (error) => { logger.error(error); }; 个承诺。