承诺“记住”先前执行的值

时间:2019-03-24 14:41:49

标签: javascript events promise

我正在兑现承诺。我执行我的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。无论如何,我的问题还是一样-行为完全没有改变。

0 个答案:

没有答案