繁体   English   中英

设置异步函数的超时,如果没有完成,则在x秒后停止运行

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM