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

Javascript 我是否应该总是“等待”每一个承诺?,javascript,node.js,Javascript,Node.js,我最近很难找到一个困扰我的问题的答案。 我应该总是等待承诺吗 我这是什么意思 假设我有一个函数,它返回一个承诺,但我并没有对这个承诺返回的值做任何事情。我还需要等待吗?或者我应该把它放在一个尝试捕捉的范围内 我应该等待返回承诺的函数吗 const specialFunction = async () => { try { await handleEventsInsertion(body) } catch (error) { logger.error(error)

我最近很难找到一个困扰我的问题的答案。 我应该总是等待承诺吗

我这是什么意思

假设我有一个函数,它返回一个承诺,但我并没有对这个承诺返回的值做任何事情。我还需要等待吗?或者我应该把它放在一个尝试捕捉的范围内

我应该等待返回承诺的函数吗


const specialFunction = async () => {

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

}
handleEventsInsertion
方法实际上是将事件插入数据库的方法。但我并没有承诺这个方法会返回。那么我应该等待吗?如果存在拒绝,则会导致未处理的拒绝


是否存在这样一种情况:我不应该等待承诺?

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

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

const specialFunction = () => {
    handleEventInsertion(body)
        .catch(error => {
            logger.error(error);
        });
}
您可以选择不这样做,但正如您已经说过的:如果出现错误,并且您没有
尝试
/
等待
/
捕获
承诺或
捕获
错误,则将视为未经处理的拒绝

编辑:

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

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

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

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

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

如果这样做,如果处理总是相同的,则不需要到处捕捉错误。在这种情况下,如果您需要函数的结果或某个特定错误需要特殊处理,您只需等待一个承诺。

“如果存在拒绝,则会导致未经处理的拒绝”:是的。那么你会怎么做?
如果有拒绝,会导致未经处理的拒绝
-这是一个声明,不是一个问题。编辑我的问题,是否存在我不应该等待承诺的情况?更新了我的回答当你有
然后
捕获处理程序时,你确实在等待承诺。@trincot这不是我的经验。每当被调用的异步函数触发错误时,
catch
处理程序就会被激发。外部调用函数并不等待这种情况发生。事实上,我指的是内部承诺。