如何处理异步回调承诺被拒绝?

时间:2019-08-19 09:32:01

标签: javascript node.js es6-promise

尝试处理异步代码(nodeJS,ExpressJS)中的每个异常: 这几乎是伪代码。我使用带有方法removeTokens(num,callback(err,remainingRequest))的限制器(npm limiter)模块。代码的很大一部分位于回调内部,我想在那里捕获任何错误并将其扔给处理程序,但现在回调内部的错误仍然标记为“未处理的异常”,我不明白为什么。

app.post('/', async (req, res) => {
  try {
    ...
    return getAll();

    async function getAll () {
      limiter.removeTokens(1, async (err, remainingRequest) => {
        try {
          throw new Error('THROWN')
        } catch (error) {
          throw error
        }
      })
    }
  } catch (error) {
    console.log(error);
  }
});

2 个答案:

答案 0 :(得分:1)

您不应将async函数传递给不期望它们的东西(除非您像捕获app.post回调一样捕获所有错误)。而是给自己一个limiter.removeTokens的包装,该包装返回一个承诺:

function removeTokens(limiter, id) {
    return new Promise((resolve, reject) => {
        limiter.removeTokens(id, (err, remainingRequest) => {
            if (err) {
                reject(err);
            } else {
                resolve(remainingRequest);
            }
        });
    });
}

(您也可以为此查看util.promisify。)

然后:

app.post('/', async (req, res) => {
  try {
    ...
    await getAll(); // *** Or you might just use `removeTokens(limiter, 1)` directly here

    function getAll() {
      return removeTokens(limiter, 1);
    }
  } catch (error) {
    console.log(error);
  }
});

此处直接使用removeTokens

app.post('/', async (req, res) => {
  try {
    ...
    await removeTokens(limiter, 1);
  } catch (error) {
    console.log(error);
  }
});

答案 1 :(得分:0)

首先,请尽可能共享尽可能多的代码,这样我们就可以轻松调试问题所在。 向您提出您的问题,我认为问题是在您的try..catch块中,您抛出的错误不是使用reject处理错误。我在下面粘贴了一个代码块,您可以尝试让我知道它是否对您有用。请注意,语法可能不会有所不同,但是您的想法是,如果出现错误,您必须reject Promise。

`````````limiter.removeTokens(1, async (err, remainingRequest) => {
````````````try {
```````````````throw new Error('THROWN')
````````````} catch (error) {
```````````````return Promise.reject(error) //
````````````}
`````````})
``````}
```} catch (error) {
``````console.log(error);
```}
})