首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SetInterval中返回“未定义”的异步函数

在SetInterval中返回“未定义”的异步函数
EN

Stack Overflow用户
提问于 2020-02-27 02:40:59
回答 1查看 141关注 0票数 0

由于某种原因,我的脚本一旦到达"ticker“setinterval循环,就会返回,而不是在循环中做什么,然后返回。

为什么它回来得早,而不是去看电影?

javascript代码

代码语言: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函数,它把搞砸了

代码语言:javascript
复制
        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)
    }

}

返回

代码语言:javascript
复制
test("animage.jpg").then(ans => {
    console.log(ans)
})
EN

回答 1

Stack Overflow用户

发布于 2020-02-27 13:28:43

setInterval将始终返回一个数字:定时器的id,然后可以传递给clearInterval。你可能想要的是把整个事情包装在一个承诺中,然后当你的条件得到满足时,它就解决了:

代码语言:javascript
复制
// 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
  });
}

这是少数几次明确构建承诺是正确的情况之一。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60425517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档