在等待结算后,try / catch中的async / await未显示处理逻辑中的错误

时间:2017-10-08 20:34:43

标签: javascript node.js design-patterns promise async-await

try/catch请求使用async/await时,需要对结果执行某些逻辑,哪个是执行该逻辑的最佳位置?我有这样的功能

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的功能,以便我可以看到它导致的实际异常?

3 个答案:

答案 0 :(得分:0)

您的第一行有await个关键字,但在调用synchronousTransform时却没有。

这意味着在发送响应并且您退出try / catch部分后,其执行可能会结束。

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

答案 1 :(得分:0)

  

然而,我在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));

答案 2 :(得分:-1)

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