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;
}
}
添加回答
举报