繁体   English   中英

如何使用 Async 和 Await [Node.js] 处理错误

[英]How to handle errors with Async and Await [Node.js]

我已经有一个用 bluebird promises 编写的 function,我想用 async 和 await 重写它。 当我进行更改时,我发现之前通过 promises 拒绝语句总是将控制权转移到调用的 function 捕获块,尽管如果捕获块已经存在于我们拒绝的文件中。 如何使用 async 和 await 正确处理这种情况? (在代码中添加了注释以解释问题)

使用 Promise:

const callingFunc = (req, res) => {

    return new Promise((resolve, reject) => {
        // execute request which returns promise
        functionCall()
            .then((response) => {
                let error;

                try {
                    xml2js(response.body, { explicitArray: false }, (err, result) => {
                        if (err) {
                            return reject(err); /* throws the correct error to catch block of the file from where callingFunc is called*/ 
                        }

                        if (!_.isEmpty(result.Response.errorCode)) {
                            return reject(result.Response); /* throws the correct error to the catch block of the file from where callingFunc is called*/ 
                        }

                        return resolve(result);
                    });
                } catch (e) {
                    error = new Error('xml2js conversion error');
                    reject(error);
                }
            })
            .catch((error) => {
                const Error = new Error('Internal Server Error');
                reject(Error);
            });
    });
};

使用异步和等待:

const callingFunc = (req, res) => {

    try {
        const response = await functionCall();
        let error;

        try {
            xml2js(response.body, { explicitArray: false }, (err, result) => {
                if (err) {
                    throw (err); /* throws the error to the below catch block and returning xml2js conversion error and changing behaviour*/ 
                }

                if (!_.isEmpty(result.Response.errorCode)) {
                    throw result.Response; /* throws the error to the below catch block and returning xml2js conversion error and changing behaviour*/
                }

                return result;
            });
        } catch (e) {
            error = new Error('xml2js conversion error');
            throw error;
        }
    } catch(error) {
        const Error = new Error('Internal Server Error');
        throw Error;
    }
}; 

如果functionCall返回一个promise,那么这个代码是不合适的......

return new Promise((resolve, reject) => {
    // execute request which returns promise
    functionCall()
        .then((response) => {

如果xml2js是使用回调异步的,那么将其包装在 promise 中是合适的...

// return a promise that resolves with the result of xml2js
async function xml2js_promise(body) {
  return new Promise((resolve, reject) => {
    xml2js(body, { explicitArray: false }, (err, result) => {
      if (err) reject(err);
      else if (!_.isEmpty(result.Response.errorCode)) reject(result.Response);
      else resolve(result);
    });
  });
}

现在我们可以等待这些了。 没有必要嵌套 try 的。 (而且你只需要尝试一下,如果你打算做点什么)。

async callingFunction = (req, res) => {
    try {
      const response = await functionCall();
    } catch (error) {
      // do something with this error
    }
    try {
      const result = await xml2js_promise(response.body)
    } catch(error) {
      // do something with this error
    }
    return result;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM