Asyn c Функция, возвращающая «undefined» при достижении SetInterval в Node.js - PullRequest
0 голосов
/ 27 февраля 2020

По какой-то причине мой скрипт вернется, как только достигнет "тикера" setinterval l oop вместо того, чтобы делать то, что внутри l oop, а затем вернется.

Почему он возвращается раньше, чем делать setinerval?

Код javascript

const puppeteer = require('puppeteer');
async function test(url3) {
    let counter = 0;
    try {
        const browser = await puppeteer.launch({
            headless: true,
            defaultViewport: null
        });
        const page = await browser.newPage();
        const url = 'https://yandex.com/images/';

        await page.goto(url);

        await page.evaluate(() => {
            document.querySelector('.input__cbir-button').firstElementChild.click();
        })

        await page.focus('input[name="cbir-url"]')
        await page.keyboard.type(url3)
        await page.keyboard.press('Enter');
        page
        .on('response', response =>{
            //console.log(`${response.url()}`)
          if(`${response.url()}` == "https://yandex.com/clck/jclck/"){
              counter++;
          }
        })

Функция SetInterval, где она портится

        var ticker = setInterval(async () => {
                if(counter === 2){
                    clearInterval(ticker)
                    if(page.$('.cbir-no-results__content' !== null)){ 
                        await browser.close();
                        return('no images found');
                    } else {
                        await page.screenshot({path: 'test.png', fullPage: true});
                        await browser.close();
                    }
                }
        })

    } catch(err) {
        //console.log(err)
    }

}

Возврат

test("animage.jpg").then(ans => {
    console.log(ans)
})

1 Ответ

0 голосов
/ 27 февраля 2020

setInterval всегда будет возвращать число: идентификатор таймера, который вы можете затем передать clearInterval. Вероятно, вы захотите обернуть всю вещь в Обещание, которое затем разрешается при выполнении вашего условия:

// no need for async, we're explicitly returning a Promise
function test() {
  return new Promise(resolve => {
    const handle = setInterval(() => {
      if (conditionMet) {
        clearInterval(handle);
        resolve();
      }
    }, 100); // or however often
  });
}

Это один из немногих случаев, когда это правильно явно создать Обещание.

...