[英]setting timeout for async function to stop running after x seconds if not done by then
这是我的代码的简化版本
async function open_tab( setting ){
const page = await global_browser.newPage();
// do stuff
page.close();
}
我想为这个功能设置超时,所以我可以添加超时
setTimeout(function(){page.close() }, 50000);
喜欢
async function open_tab( setting ){
const page = await global_browser.newPage();
setTimeout(function(){page.close() }, 50000);
// do stuff
page.close();
}
但是我如何打破主要功能(open_tab),以便在超时后不会继续运行?
**这个功能打开一个无头浏览器(chrome puppeteer)并通过一些网页导航,有时它会卡在某个地方导航,无论什么原因和浏览器长时间保持打开...我想打破功能并关闭在这些情况下的选项卡...请求注意我不想在功能中延迟代码,我希望功能在x秒后停止运行,如果没有完成的话**
我试过这个
async function open_tab( setting ){
const page = await global_browser.newPage();
await new Promise((resolve, reject) => {
setTimeout(reject, 50000);
await page.goto("http://example.com" );
resolve();
}).then(() => {console.log('done in time!');}).catch(() => {console.log('somethign went wrong !');})
}
但我得到了
await page.goto("http://example.com" );
^^^^^
SyntaxError: await is only valid in async function
只需使用Promise:
async function open_tab( setting ){
const page = await global_browser.newPage();
await new Promise((resolve, reject) => {
setTimeout(reject, 50000));
// do stuff;
resolve();
}).then(() => // on time)
.catch(() => // too long)
.then(() => page.close());
}
如果您不需要处理浏览器是否卡住,可以使用resolve():
async function open_tab( setting ){
const page = await global_browser.newPage();
await new Promise(resolve => {
setTimeout(resolve, 50000));
// do stuff;
resolve();
})
.then(() => page.close());
}
编辑:如果你需要在promise回调中调用异步函数,请标记该回调async
:
async function open_tab( setting ){
const page = await global_browser.newPage();
await new Promise(async (resolve) => {
setTimeout(resolve, 50000));
// await do stuff;
resolve();
})
.then(() => page.close());
}
您可以将延迟移动到它自己的函数中,该函数返回一个promise并等待它。
这是一个简单的例子。
function delay(time = 2000) {
return new Promise((res, rej) => {
console.log('Delay started');
setTimeout(() => {
console.log('Delay running');
res();
}, time)
});
}
async function foo() {
console.log('Inside foo');
await delay();
console.log('Runs after delay');
}
foo();
Repl: https : //repl.it/repls/PrevailingLightgreyAssemblylanguage
您可以使用蓝鸟库的Promise.delay
const Promise = require('bluebird');
async function main() {
console.log('Before delay');
await Promise.delay(1000);
console.log('After delay');
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.