我应该总是“等待”每一个承诺吗?

Eit*_*ank 2 javascript node.js

我很难找到有关最近困扰我的问题的答案。我应该一直await承诺吗?

我是什么意思?

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

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


const specialFunction = async () => {

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

ric*_*aan 6

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

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

const specialFunction = () => {
    handleEventInsertion(body)
        .catch(error => {
            logger.error(error);
        });
}
Run Code Online (Sandbox Code Playgroud)

您可以选择这样做,但你已经指出:如果发生错误,你不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);
        });
};
Run Code Online (Sandbox Code Playgroud)

编辑2

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

window.onunhandledrejection = (error) => {
    logger.error(error);
};
Run Code Online (Sandbox Code Playgroud)

如果你这样做,如果处理总是相同的,你就不需要在任何地方捕获错误。在这种情况下,await如果您需要函数的结果或特定错误需要特殊处理,您只需要承诺。