Javascript try/catch中的async/await在wait解析后不显示处理逻辑中的错误
当对异步/等待请求使用try/catch,并且需要对结果执行某种逻辑时,哪里是执行该逻辑的最佳位置?我有一个这样的函数Javascript try/catch中的async/await在wait解析后不显示处理逻辑中的错误,javascript,node.js,design-patterns,promise,async-await,Javascript,Node.js,Design Patterns,Promise,Async Await,当对异步/等待请求使用try/catch,并且需要对结果执行某种逻辑时,哪里是执行该逻辑的最佳位置?我有一个这样的函数 function synchronousTransform (data) { return data.reduce( n => n * 2) } async function requestFn () { try { const myPromisedValue = await axios.get(url) const result = synchr
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的功能,以便能够看到它导致的实际异常?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');
}
}
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');
}
}
在第一行中有wait关键字,但在调用synchronousTransform时没有
这意味着它的执行可能会在发送响应并且您退出try/catch部分后结束
您遗漏了它的内部代码,因此无法说明它是否返回承诺,但在调用它时,它应该有wait。您在第一行中有wait关键字,但在调用synchronousTransform时没有
这意味着它的执行可能会在发送响应并且您退出try/catch部分后结束
你漏掉了它的内部代码,所以不能说它是否返回了一个承诺,但调用它时它应该等待
然而,我在try/catch块中看到的唯一抛出的东西是
好像这是XHR的问题
不确定这是如何实现的,在问题代码处不应访问res.status200.sendresult。您可以使用console.trace获取有关错误的进一步数据
模式实质上取决于如何处理错误以及预期结果;也就是说,如果希望在第一个参数to.then或第二个参数to.then和catch内处理错误。这是开发人员根据应用程序的需求自行决定的
函数同步转换数据{
//重新格式化“数据”的某些代码无效
抛出新错误SynchronousTransform错误
}
异步函数{
请求;
试一试{
request=wait Promise.resolve1.thensynchronousTransform
.catcherr=>{console.errorerr;throw err};
console.logtryed;//未调用
}捕手{
console.error再次捕获,错误;
请求=错误;
}最后{
//现在已处理该错误
console.logfinally;
}
返回请求;
}
fn
.thendata=>{
如果数据实例出错{
//跟踪抛出错误
console.tracetrace抛出错误,数据;
抛出数据
}否则{
//处理数据
}
}
.catcherr=>console.errorcatch再次出现错误;
然而,我在try/catch块中看到的唯一抛出的东西是
好像这是XHR的问题
不确定这是如何实现的,在问题代码处不应访问res.status200.sendresult。您可以使用console.trace获取有关错误的进一步数据
模式实质上取决于如何处理错误以及预期结果;也就是说,如果希望在第一个参数to.then或第二个参数to.then和catch内处理错误。这是开发人员根据应用程序的需求自行决定的
函数同步转换数据{
//重新格式化“数据”的某些代码无效
抛出新错误SynchronousTransform错误
}
异步函数{
请求;
试一试{
request=wait Promise.resolve1.thensynchronousTransform
.catcherr=>{console.errorerr;throw err};
console.logtryed;//未调用
}捕手{
console.error再次捕获,错误;
请求=错误;
}最后{
//现在已处理该错误
console.logfinally;
}
返回请求;
}
fn
.thendata=>{
如果数据实例出错{
//跟踪抛出错误
console.tracetrace抛出错误,数据;
抛出数据
}否则{
//处理数据
}
}
.catcherr=>console.errorcatch再次出现错误;如果synchronousTransform中存在错误,则如果GET请求成功,则应捕获该错误并将其存储在xhrError中。您可以嵌套try-catch块??或者简单地解决这个错误……似乎synchronousTransform中的某些东西不起作用,如果问题是synchronousTransform,我就会出错。为什么问题中包含requestFn的代码而不是synchronousTransform的完整代码?@guest271314,因为我确信我可以轻松地
一旦我了解了如何将async/await/try/catch与ajax成功完成后需要发生的逻辑结合起来的良好模式,代码就会出现错误。为什么我要包括它?你需要把你得到的错误贴出来。您还需要console.log axios结果,以确保其为实际数组。如果synchronousTransform中存在错误,则应捕获该错误并将其存储在xhrError中(如果GET请求成功)。您可以嵌套try-catch块??或者简单地解决这个错误……似乎synchronousTransform中的某些东西不起作用,如果问题是synchronousTransform,我就会出错。为什么问题中包含requestFn的代码,而不是synchronousTransform的完整代码?@guest271314因为我确信,一旦我了解了一个好的联合模式,我就可以轻松地调试代码了async/await/try/catch,包含ajax成功完成后需要执行的逻辑。为什么我要包括它?你需要把你得到的错误贴出来。您还需要console.log axios结果,以确保它是一个实际的数组。很抱歉犯了一个错误。”myPromisedValue’应该传递到回调函数中,因为axios.get不再是等待的promiseYep,我想这就是发生的事情。这看起来不错。我很想知道是否还有其他人有更好的想法。谢谢我想我想出了一个更好的主意。你能检查第二个是否有效吗?finally块将始终执行。这两个res发送将如何工作?虽然这节省了一层压痕,但我不确定它是否更好。但是我对这方面还不太熟悉,所以我不能完全确定这是否是一个正确的观点。一个没有解释的答案可以通过用语言解释OP的原始问题是什么以及你做了什么来解决它而得到显著的改善。事后来的人必须做一些视觉上的差异来找出你改变了什么,但没有解释为什么。对不起,我犯了一个错误myPromisedValue’应该传递到回调函数中,因为axios.get不再是等待的promiseYep,我想这就是发生的事情。这看起来不错。我很想知道是否还有其他人有更好的想法。谢谢我想我想出了一个更好的主意。你能检查第二个是否有效吗?finally块将始终执行。这两个res发送将如何工作?虽然这节省了一层压痕,但我不确定它是否更好。但是我对这方面还不太熟悉,所以我不能完全确定这是否是一个正确的观点。一个没有解释的答案可以通过用语言解释OP的原始问题是什么以及你做了什么来解决它而得到显著的改善。事实发生后,人们不得不做一些视觉上的差异来找出你改变了什么,但没有解释为什么。。。。但它显然被称为“同步变换”。如果你是对的,那么这是解决这个问题的唯一更多理由;它不返回承诺,只返回一个值。您遗漏了它的内部代码,因此不能说它是否返回承诺,但调用它时它应该等待。=>即使是非承诺返回和简单的同步操作?@MeirionHughes最初的原因是什么?@1252748您的代码没有问题;任何错误都会被捕获。如果axios请求失败,它将被捕获并以500状态发送。如果您在转换中错误地访问了响应数据,则会捕获响应数据并将其发送回您。你的问题是请求不好或者你得到的实际身体不是你期望的。。。。但它显然被称为“同步变换”。如果你是对的,那么这是解决这个问题的唯一更多理由;它不返回承诺,只返回一个值。您遗漏了它的内部代码,因此不能说它是否返回承诺,但调用它时它应该等待。=>即使是非承诺返回和简单的同步操作?@MeirionHughes最初的原因是什么?@1252748您的代码没有问题;任何错误都会被捕获。如果axios请求失败,它将被捕获并以500状态发送。如果您在转换中错误地访问了响应数据,则会捕获响应数据并将其发送回您。您的问题是请求不正确,或者您返回的实际正文不是您所期望的。请注意,如果实际的XHR请求也是一个问题,那么这个问题可以同时解决,以确定如何处理依赖于成功XHR请求的响应数据的后续函数调用中可能出现的错误。否则,如果查询与处理XHR和后续错误无关,则不确定查询解决的是什么问题。注意,如果实际的XHR请求也是一个问题,这个问题可以同时解决,以决定如何处理依赖于成功XHR请求的响应数据的后续函数调用中可能出现的错误。否则,如果查询不涉及XHR和后续错误的处理,则不确定 调查正在解决的问题。