2 回答

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

TA貢獻1831條經驗 獲得超9個贊
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;
? ?}
}
添加回答
舉報