Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript try/catch中的async/await在wait解析后不显示处理逻辑中的错误_Javascript_Node.js_Design Patterns_Promise_Async Await - Fatal编程技术网

Javascript try/catch中的async/await在wait解析后不显示处理逻辑中的错误

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

当对异步/等待请求使用try/catch,并且需要对结果执行某种逻辑时,哪里是执行该逻辑的最佳位置?我有一个这样的函数

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和后续错误的处理,则不确定 调查正在解决的问题。