异步/等待-等待功能和非等待功能的组合



我想将需要等待的异步函数和不需要等待的函数结合起来。首先是代码。。。

async function doSomeStuff() {
try {
const data = await getDataFromDatabase()
if(data.canDoStuff == "yes") {
doAsynchronousStuffIDoNotNeedToAwait()
}
if(data.canDoSecondStuff == "yes") {
doSecondAsynchronousStuffIDoNotNeedToAwait()
.then(result => console.log("Done!");
}
} catch(err) {
console.log(err)
}
}

这是我的问题。如果我的doAsynchronousStuffIDoNotNeedToAwait()抛出错误,它会触发catch函数吗?在第二个函数doSecondAsynchronousStuffIDoNotNeedToAwait()中,是否有更好的方法来处理结果?这段代码是否有一些缺点,或者可以用更好的方式编写?

我希望问题清楚,代码简单易懂。如果没有,请留下评论,我将编辑我的问题。谢谢:(

好吧,让我们试一试:

function getDataFromDatabase() {
return new Promise((resolve) => {
setTimeout(resolve, 250, {canDoStuff: 'yes', canDoSecondStuff: 'yes'});
});
}
function doAsynchronousStuffIDoNotNeedToAwait() {
return new Promise((resolve) => {
setTimeout(resolve, 250);
});
}
function doSecondAsynchronousStuffIDoNotNeedToAwait() {
return new Promise((_, reject) => {
setTimeout(reject, 250, 'error: doSecondAsynchronousStuffIDoNotNeedToAwait()');
});
}
async function doSomeStuff() {
try {
const data = await getDataFromDatabase()
if(data.canDoStuff == "yes") {
doAsynchronousStuffIDoNotNeedToAwait()
}
if(data.canDoSecondStuff == "yes") {
doSecondAsynchronousStuffIDoNotNeedToAwait()
.then(result => console.log("Done!"));
}
} catch(err) {
console.log(err)
}
}
doSomeStuff();

正如您通过运行代码片段所看到的,不,try/catch不会捕捉到错误,但您将获得全局?错误由于promise不在try-catch的"范围"内,异步等待try/catch捕获的唯一错误是抛出正常异常或等待的promise被拒绝。因此,您必须使用catch函数以旧的方式处理异步错误。

function getDataFromDatabase() {
return new Promise((resolve) => {
setTimeout(resolve, 250, {canDoStuff: 'yes', canDoSecondStuff: 'yes'});
});
}
function doAsynchronousStuffIDoNotNeedToAwait() {
return new Promise((resolve) => {
setTimeout(resolve, 250);
});
}
function doSecondAsynchronousStuffIDoNotNeedToAwait() {
return new Promise((_, reject) => {
setTimeout(reject, 250, 'error: doSecondAsynchronousStuffIDoNotNeedToAwait()');
});
}
async function doSomeStuff() {
try {
const data = await getDataFromDatabase()
if(data.canDoStuff == "yes") {
doAsynchronousStuffIDoNotNeedToAwait()
}
if(data.canDoSecondStuff == "yes") {
doSecondAsynchronousStuffIDoNotNeedToAwait()
.then(result => console.log("Done!")).catch((err) => console.log(err));
}
} catch(err) {
console.log(err)
}
}
doSomeStuff();

测试起来很简单:

await使值按预期工作:

function getDataFromDatabase(){
return Promise.resolve({canDoStuff: "yes"})
}
function doAsynchronousStuffIDoNotNeedToAwait(){
return Promise.reject("whoops")
}
async function doSomeStuff() {
try {
const data = await getDataFromDatabase()
if(data.canDoStuff == "yes") {
let d = await doAsynchronousStuffIDoNotNeedToAwait()
}

} catch(err) {
console.log("caught error:", err)
}
}
doSomeStuff()

如果没有await,你会得到一个未捕获的承诺拒绝错误(我认为只有在控制台中才能在SO上看到(:

function getDataFromDatabase(){
return Promise.resolve({canDoStuff: "yes"})
}
function doAsynchronousStuffIDoNotNeedToAwait(){
return Promise.reject("whoops")
}
async function doSomeStuff() {
try {
const data = await getDataFromDatabase()
if(data.canDoStuff == "yes") {
doAsynchronousStuffIDoNotNeedToAwait()
}

} catch(err) {
console.log("caught error", err)
}
}
doSomeStuff()

这是有道理的,因为如果没有await,函数不会等待promise解析,并且函数在有机会捕获被拒绝的promise之前完成。

最新更新