簡體   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