我有此代码:
async function getURL() {
try {
await fetch("http://www.blah.com");
return 0;
} catch (err) {
return err;
}
}
getURL().then( result => {
if (result === 0) console.log("success");
else console.log(result);
});
提取将失败,并且错误记录到控制台。如何重新编写代码,使其在所有地方都使用异步和try / catch?也就是说,为了保持一致性,我希望避免执行getURL()。
编辑:
对于那些讨厌我的人,await getURL()
无效,因为它的语法无效。
EDIT2:
尝试过此操作,但未捕获到错误:
async function getURL() {
return await fetch("http://www.blah.com");
}
let result = async function() {return await getURL();}
try {
result();
} catch (e) {
console.log(e);
}
答案 0 :(得分:1)
每次您都需要从承诺中捕获错误时,使用new Promise
,async-await
或generator
都需要使用.then()
,或者您也可以这样做async-await
。
async function getURL() {
try {
await fetch("http://www.blah.com");
return 0; // EDIT: just returning value which is success
} catch (err) {
return err; // EDIT: returning value not rejecting a promise
}
}
async function main () {
try {
let result = await getURL();
if (result === 0) console.log("success");
console.log(result); // EDIT: error will be print.
}
catch (err) { // EDIT: getURL() never rejects so always success.
console.log(err);
}
});
main();
当我们在server-side
或client-side
中的主要函数处于异步状态并为我们处理时,这种情况实际上不会发生。
喜欢使用express
:
app.post('/api', async (req, res) => {
try {
let result = await getURL();
res.send(async);
}
catch(err) {
res.send(err);
}
});
编辑:asyn-await
不是reject
或resolve
的电话,只是返回一个值。因此必须谨慎使用。
function fetch(url) {
return new Promise( (resolve, reject) => {
let x = Math.floor(Math.random() * Math.floor(9) + 1);
// 50-50 resolve or reject
if(x%2===0) return resolve(false); //resolve with `false` statement
reject(true); // reject with `true` still a reject
});
}
async function getURL() {
try {
await fetch("http://www.blah.com");
return 0; // if fetch resolve
} catch (err) { //only if fetch reject
return err;
}
}
async function main () {
try {
let result = getURL();
if (result === 0) console.log("success"); //getURL never reject any call
console.log(result);
}
catch (err) { // getURL doesnt reject
console.log(err);
}
};
main();
答案 1 :(得分:1)
您可以将整个代码包装在即时执行的异步函数中,如下所示:
// service.js
async function getURL() {
return await fetch("http://www.blah.com");
}
// your.module.js
(async function() {
// do things...
try {
let result = await getURL();
} catch (e) {
console.log(e);
}
// do things...
res.send({});
});
答案 2 :(得分:0)
我意识到现在异步函数总是返回一个Promise。即使您抛出了错误,它也仍然可以兑现承诺。因此,使用try / catch将无济于事。这就是我最终编写代码的方式:
async function getURL() {
return await fetch("http://fake");
}
getURL().then( () => console.log("success")).catch( (e) => console.log(e));