【问题标题】:Javascript: How to run async functions in different threads?Javascript:如何在不同的线程中运行异步函数?
【发布时间】:2019-09-17 16:00:02
【问题描述】:

我有一个异步函数,它在我的 js 代码中返回一个承诺,如下所示;

async launch(){
  return new Promise (function(resolve, reject){
    let opts = {
      headless: false,
      defaultViewport: null,
      args: ['--start-maximized'],
      slowMo: 1,
      timeout: 10000
    };
    puppeteer
      .launch(opts)
      .then(function (browser) {    
        resolve(browser);
      });
  });
}

它使用 puppeteer 启动一个新的浏览器页面。

用法:

var browserLauncher = new BrowserLauncher();
var browser = await browserLauncher.launch();
var page = await browser.newPage();

所以我想在不同的线程中同时启动 5 个浏览器。我该怎么做?

【问题讨论】:

  • 我认为提供的详细信息还不够。您能否详细说明问题细节,例如框架(如果有)
  • javascript中没有线程
  • @Harish 不知道的可以去google搜索puppeteer框架,具体我也帮不了你,因为我不懂你不懂的东西。
  • 我听说他们使用 setTimeout 函数来提供线程机制,但由于等待错误,我没有这样做。 @JaromandaX

标签: javascript async-await


【解决方案1】:

您可以将await 多个Promises 与Promise.all。请参见下面的示例:

function performTask(message, timeout) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(`Completed ${message}`);
    }, timeout);
  });
}

(async () => {
  const allTasks = [
    performTask('first', 500),
    performTask('second', 100),
    performTask('third', 200),
  ];

  await Promise.all(allTasks);
})();

在您的示例中,您可以将您的操作封装在 async 方法中,如下所示:

async function launchBrowser(options) {
  var browserLauncher = new BrowserLauncher();
  var browser = await browserLauncher.launch();
  var page = await browser.newPage();
}

await Promise.all([
  launchBrowser({ /* options */ }),
  launchBrowser({ /* options */ }),
  launchBrowser({ /* options */ }),
  launchBrowser({ /* options */ }),
  launchBrowser({ /* options */ }),
]);

【讨论】:

  • 感谢您的回复,但是当我尝试您的解决方案时,它返回“等待仅在异步函数中有效”错误,但我已从 Promise 函数的开头删除了“等待”而不是完成。谢谢:)
  • 我想我读到 Chrome 现在支持顶级 await (github.com/tc39/proposal-top-level-await),但其他浏览器可能不支持。
  • 我只是在 chromium-browser 上运行它,所以我认为这不是问题。
  • 如果你需要在Promise.all之后执行一些东西,你可以将它包装在一个自执行函数中。即(async () => { /* code with await */ })... 或使用老派promise.then()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
相关资源
最近更新 更多