Обещание «запомнить» значение из предыдущего исполнения - PullRequest
0 голосов
/ 24 марта 2019

Я работаю с обещаниями.Я выполняю свой метод обещания:

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.До этого он, кажется, не умножается.

Я не понимаю.Почему он все еще работает со старыми параметрами, хотя я решил это?Почему этот метод умножается?

Код waitForCoords, который находится в выражении if:

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);
});

Таким образом, он разрешает false каждые 3 секунды и разрешает true после завершения чего-либо (метод кукловода)которые выполняют js в контексте страницы, но я думаю, что это не имеет значения).


Edit : я дополнительно добавляю явный таймаут в метод waitForCoords, чтобы он не разрешал falseпосле того, как это решает истину.В любом случае, моя проблема все та же - поведение не изменилось вообще.

...