asynchronous/等待try / catch在处理逻辑等待解决后不显示错误

当使用try/catch进行async/await请求,并且需要对结果执行一些逻辑时,哪里是做逻辑的最佳位置? 我有这样的function

 function synchronousTransform (data) { return data.reduce( n => n * 2) } async function requestFn () { try { const myPromisedValue = await axios.get(url) const result = synchronousTransform(myPromisedValue.data) res.status(200).send(result) } catch (xhrError) { res.status(500).send(xhrError) } finally { console.log('done') } } 

似乎在synchronousTransform中的东西不工作,我得到的错误。 不过,我在try / catch块中看到的唯一事情就像是XHR的问题。 我如何隔离synchronousTransform的function,以便我可以看到它引起的实际exception?

您在第一行中await关键字,但在调用synchronousTransform时不会。

这意味着它的执行可能会在响应被发送后结束,并且你不在try / catch部分。

你遗漏了它的内部代码,所以不能说它是否返回一个promise,但它应该await调用它。

不过,我在try / catch块中看到的唯一事情就像是XHR的问题。

不知道如何这是可能的, res.status(200).send(result)不应该达到问题的代码。 您可以使用console.trace()获取有关错误的更多数据。

这种模式在很大程度上取决于如何处理错误和预期的结果。 也就是说,如果预期错误将在第一个参数中处理,然后在.then()或第二个参数中处理.then()catch() 。 这是开发人员根据应用程序的要求自行决定的。

 function synchronousTransform (data) { // some code to reformat `data` that is not working throw new Error("synchronousTransform error") } async function fn() { let request; try { request = await Promise.resolve(1).then(synchronousTransform) .catch(err => { console.error(err); throw err}); console.log("tried"); // not called } catch(err) { console.error("caught again", err); request = err; } finally { // the error is handled by now console.log("finally"); } return request; } fn() .then(data => { if (data instanceof Error) { // trace the throw error console.trace("trace thrown error", data); throw data } else { // do stuff with data } }) .catch(err => console.error("caught yet, again", err)); 

OP的问题是“synchronousTransform”应该会抛出一个错误,但是由于它被封装在一个try-catch块内部而无法正常工作。 这个问题可以通过简单地将“synchronousTransform”放在try-catch块的直接范围之外来解决。

 function synchronousTransform (data) { // some code to reformat `data` that is not working } async function requestFn() { try { await new Promise(function(resolve, reject) { axios.get(url).then(function(myPromisedValue) { const result = synchronousTransform(myPromisedValue.data); res.status(200).send(result); resolve(); }).catch(function(err) { reject(err); }); }); } catch (xhrError) { res.status(500).send(xhrError) } finally { console.log('done') } } 

或更好

 async function requestFn() { let myPromisedValue; try { myPromisedValue = await axios.get(url); } catch (xhrError) { res.status(500).send(xhrError); } finally { if (myPromisedValue && myPromisedValue.data) { const result = synchronousTransform(myPromisedValue.data); res.status(200).send(result); } console.log('done'); } }