我正在兑现承诺。我执行我的promise方法:
async gotoMap(page, expectedStartName, endMap) {
let someArray = [{x: 12, y: 15}, {x: 23, y: 56}];
await goTo.init(page, someArray[0].x, someArray[0].x.y);
console.log('After first map.');
await checkIfWeWentThrough(); //other async method, irrelevant
await goTo.init(page, someArray[1].x, someArray[1].y);
console.log('After second map.');
}
},
goTo.init
方法的代码:
return new Promise((resolve, reject) => {
eventBus.on('start::goto', async() => {
console.log('start::goto');
await this.goto(page, x, y);
if (await waitForCoords(page, x, y)) {
console.log('we achieve goal');
resolve();
} else {
console.log('emit start::goto inner');
eventBus.emit('start::goto');
}
});
console.log('emit start::goto outer');
eventBus.emit('start::goto');
});
console.log“我们实现了目标”,因此我希望第一次执行完成,解决并消失。
我第二次执行此方法后(可以说20秒,但是在第一次执行完成后几乎立即执行),由于waitForCoords
的控制台日志,我仍然可以看到它在第一次执行时就带有参数(参数)运行。
除了我看到有越来越多的console.logs。运行一分钟后,此方法多次出现,以至于每隔几毫秒它就会向控制台发送垃圾邮件。但这只会在goTo.init
的第二次执行后后发生。在此之前,它似乎并没有增加。
我不明白。尽管我已解决它,但为什么它仍旧使用旧参数运行?为什么要乘这种方法?
if语句中的waitForCoords
的代码为:
return new Promise(async(resolve, reject) => {
let timeoutId = setTimeout(() => {
resolve(false);
}, 3000);
console.log(x,y);
await page.waitForFunction(`
window.hero.x === ${x} && window.hero.y === ${y}
`);
clearTimeout(timeoutId);
resolve(true);
});
因此,它每3秒解析一次false,并在完成某些操作后解析为true(在页面上下文中执行js的puppeteer方法,但我认为这没有关系)。
编辑:我还为waitForCoords
方法添加了明确的超时,因此它在解析为true后不会解析为false。无论如何,我的问题还是一样-行为完全没有改变。