由于某种原因,我的脚本一旦到达"ticker“setinterval循环,就会返回,而不是在循环中做什么,然后返回。
为什么它回来得早,而不是去看电影?
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)
})发布于 2020-02-27 13:28:43
setInterval将始终返回一个数字:定时器的id,然后可以传递给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
});
}这是少数几次明确构建承诺是正确的情况之一。
https://stackoverflow.com/questions/60425517
复制相似问题