对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
的功能,以便我可以看到它导致的实际异常?
答案 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)
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');
}
}