【问题标题】:How to handle async callback promise rejection?如何处理异步回调承诺拒绝?
【发布时间】:2019-08-19 17:58:20
【问题描述】:

尝试处理我的异步代码(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);
  }
});

【问题讨论】:

    标签: javascript node.js es6-promise


    【解决方案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);
      }
    });
    

    【讨论】:

      【解决方案2】:

      首先,如果可能,请尽可能多地分享代码,这样我们就可以轻松调试问题所在。 向您提出您的问题,我认为问题在于在您的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);
      ```}
      })
      

      【讨论】:

        猜你喜欢
        • 2020-03-22
        • 1970-01-01
        • 2019-02-21
        • 1970-01-01
        • 2021-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-11
        相关资源
        最近更新 更多