2 回答

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
prime 的答案將使您更接近并提供一些有用的材料供閱讀。我想我會(huì)通過修復(fù)幾個(gè)問題并添加更多解釋來在此基礎(chǔ)上進(jìn)行一些改進(jìn)。
下面是您的代碼的工作演示
(async function() {
let condition = true;
while (condition) condition = await checkCondition();
})()
async function checkCondition() {
console.log('checkCondition was called');
if (await someAsyncLogic() !== null){ // condition met
return true;
} else { // condition not met
return false;
}
}
async function someAsyncLogic() {
return Math.random() > 0.2 ? true : null;
}
您的代碼實(shí)際上具有以下內(nèi)容:
function checkCondition(){
(async () => {
// do some logic
return true/false
})();
}
這里的問題是,你的 return true/false 只會(huì)讓你內(nèi)心的 IIFE(async () => ...)()提供一個(gè)解析為 true/false 的承諾。如果您愿意,您甚至可以將該值存儲(chǔ)在變量中。
function checkCondition(){
const theResult = (async () => {
// do some logic
return true/false
})();
console.log(theResult) // <-- [object Promise]
console.log(await theResult) // <-- true/false
}
但是,正如我們所看到的, checkCondition 本身不返回任何內(nèi)容。只有里面的內(nèi)部函數(shù)才可以。您必須返回 theResult 才能執(zhí)行此操作 - 但為了做到這一點(diǎn),您需要將 checkCondition 聲明為異步函數(shù),此時(shí),不再需要異步 IIFE,這就是該示例將其刪除的原因。
如果 checkCondition 是異步的,那么調(diào)用它的代碼必須使用 wait,并且必須位于異步上下文中(如 async IIFE 或普通的異步函數(shù))。

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
const condition = true;
while (condition) condition = checkCondition();
async function checkCondition() {
? ?if (await page.$('condition') !== null){ // condition met
? ? ? ? return true;
? ?} else { // condition not met
? ? ? ? return false;
? ?}
}
添加回答
舉報(bào)