簡體   English   中英

如何處理異步回調承諾拒絕?

[英]How to handle async callback promise rejection?

嘗試處理我的異步代碼(nodeJS、ExpressJS)中的每個異常:這里幾乎是偽代碼。 我使用帶有方法 removeTokens (num, callback(err,remainingRequest)) 的限制器(npm 限制器)模塊。 大部分代碼在回調內部,我想捕獲任何錯誤並將其拋出給處理程序,但現在回調內部的錯誤仍然標記為“未處理的異常”,我不明白為什么。

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);
  }
});

你不應該將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查看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);
  }
});

首先,如果可能的話,請盡可能多地分享代碼,這樣我們就可以輕松地調試問題所在。 向您提出您的問題,我認為問題在於在您的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);
```}
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM