- 你已经发布了
getContent
的定义,而不是searchTarget
的定义。
- 你正在将
searchTarget
的结果传递给setInterval
,而不是传递对函数searchTarget
的引用。
- 你说你收到了错误信息,但没有说明这些错误是什么。
- 你可以使用
async function
与setInterval
一起使用。
- 在使用
console.log
时不需要使用await
(因为console.log
不返回任何东西,更不用说Promise<T>
了)。
我猜你实际想要的是:
async function getContent() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url);
const content = await page.content();
console.log(content);
await browser.close();
}
const timerId = window.setInterval( getContent, 13 * 1000 );
我建议添加错误处理机制,第一次出现错误就停止间隔循环:
let intervalTimerId = null;
async function getContent() {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url);
const content = await page.content();
await console.log(content);
await browser.close();
}
catch( err ) {
console.error( "Error in getContent: %o", err );
if( intervalTimerId ) {
window.clearInterval( intervalTimerId );
}
}
}
intervalTimerId = window.setInterval( getContent, 13 * 1000 );
替代方案:
正如其他用户@mplungjan和@RohanAsokan指出的那样,您的代码存在潜在的设计问题,因为setInterval
会每13秒调用一次getContent
,即使前一个对getContent
的调用还没有完成 - 如果(例如)await page.content()
运行时间超过了13秒,就可能发生这种情况。
在这种情况下,解决方案是使用window.setTimeout
而不是window.setInterval
,并从getContent
内部调用它,像这样:
let lastSetTimeoutId = null;
async function getContentAndStartLoop() {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url);
const content = await page.content();
console.log(content);
await browser.close();
lastSetTimeoutId = window.setTimeout( getContentAndStartLoop, 13 * 1000 );
}
catch( err ) {
console.error( "Error in getContent: %o", err );
}
}
请注意,
getContentAndStartLoop
函数将在第一次循环后解决,但会继续运行直到抛出错误。
更好的方法是:
我认为最好这样结构化(使用一个名为
delay
的
Promise
-适配器来代替
setTimeout
):
async function myProgram() {
const url = "https://thispersondoesnotexist.com/":
const browser = await puppeteer.launch();
const page = await browser.newPage();
try {
while( true ) {
await page.goto( url );
const content = await page.content();
console.log( content );
await delay( 13 * 1000 );
}
}
catch( err ) {
console.error( "Error in myProgram: %o", err );
}
finally {
await browser.close();
}
}
async function delay( ms, state = null ) {
return new Promise( ( resolve, reject ) => {
window.setTimeout( () => resolve( state ), ms );
} );
}
getContent
的函数,但是你正在将一个名为searchTarget
的函数调用结果(而不是函数本身)传递给setInterval
。 - DaisetInterval(searchTarget, 13000);
中不使用()。 - mplungjan