[英]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.