如何通过异步/等待进行错误处理而不必等待

时间:2018-09-28 20:39:46

标签: javascript async-await

以下面的人为例子为例:

const housekeepingStuff = async function (data) {
    const result = await notImportant(data);
    result.more = 'yawn';
    storeInDatabase(result);
};

const getStuff = async function () {
    try {
        const data = await getData();
        data.extra = 'wow';
        housekeepingStuff(data); // <---- don't want to await... but need to for error catching
        return Promise.resolve(data);
    } catch (err) {
        return Promise.reject(err);
    }
};

try {
    const myData = await doSomeStuff();
    res.send(myData);
} catch (err) {
    console.log(err);
    res.sendStatus(400);
}

我想尽快从getStuff ()返回数据,而不等待housekeepingStuff(),但是如果我不等待该函数,则会遇到未捕获的错误。

在将数据获取并发送给任何想要的人之后,我可以在housekeepingStuff()函数之外调用getStuff()

try {
    const myData = await doSomeStuff();
    res.send(myData);
    await housekeepingStuff(data); // <---- am awaiting but who cares because nothing follows
} catch (err) {
    console.log(err);
    res.sendStatus(400);
}

但这似乎不对,因为我不想每次调用housekeepingStuff()时都记得要调用doSomeStuff()……在理想情况下,应该“内部”处理。

这里正确的方法是什么?

1 个答案:

答案 0 :(得分:1)

promise(或异步)功能有两种可能的结果:

  1. 成功的结果
  2. 错误结果

要获得任何结果,您必须等待。您不能等待一个条件,而不能等待另一个条件,因为整个过程都需要执行,因此您可以找出结果是什么。

否则,您实际上是在问JavaScript引擎:请为我预测函数是否会失败,如果失败,请等待它。

因此,正确的方法是等待它。

但是,如果您不关心此函数的成功或失败,只需通过另一个异步函数调用该函数即可,该异步函数会吞噬所有错误:

async function doSomeStuffAndIgnoreError() {
   try {
     await doSomeStuff();
   } catch (e) {
     console.error(e);
   }
}