javascript - 从单参数函数应用程序到在节点中使用 async/await 进行数组映射

标签 javascript functional-programming async-await ecmascript-2016

我是现代 JavaScript 中的等待/异步新手。我知道一般有很多与此相关的问题,但在这个问题中,我专门寻找一个模板来思考如何采用单个函数并将其重写为数组上的映射。

我从 here 的一个非常简单的屏幕截图功能开始:

const puppeteer = require('puppeteer');

puppeteer.launch().then(async browser => {
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.screenshot({path: 'screenshot.png'});
  await browser.close();
});

这只是一张截图。我想给它一个数组,并让它截取多个屏幕截图。

对于我的应用程序,我使用 mypage 变量稍微调整一下:

const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
  const mypage = 1
  const page = await browser.newPage();
  await page.goto(`https://localhost:9001/${mypage}`);
  await page.screenshot({path: `${mypage}.png`});
  await browser.close();
});

现在,我想通过 mypages = [1 ... 1000] 参数化此列表。在较旧的 javascript 中,使用 underscore.js,我会尝试类似的操作:

// define the function
function ss(mypage) {
  puppeteer.launch().then(async browser => {
    const page = await browser.newPage();
    await page.goto(`https://localhost:9001/${mypage}`);
    await page.screenshot({path: `${mypage}.png`});
    await browser.close();
});  
}

// populate the array of pages, eg make var mypages = [1,2,3...1000]
var mypages = [];
for (var i = 1; i <= 1000; i++) {
    mypages.push(i);
}

// call the screenshot function on each page in my pages.
_.each(mypages, ss)

我不清楚如何使用 async/await 来处理 mypages 中的每个页面(并且也可能更惯用地生成此数组)。

如何重写适用于 mypage = 1 的 puppeteer 函数,以映射整个 mypages 数组?

最佳答案

屏幕截图功能应该是异步的:

 async function screenshot(mypage) {
  const browser = await  puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(`https://localhost:9001/${mypage}`);
  await page.screenshot({path: `${mypage}.png`});
  await browser.close();
}

然后一张一张地截图:

 (async function() {
    for(let i = 0; i < 1000; i++)
      await screenshot(i);
 })();

或者同时进行(不确定这是否有效):

 Promise.all(Array.from({ length: 1000 }, (_, i) => screenshot(i)))
  .then(/*...*/);

关于javascript - 从单参数函数应用程序到在节点中使用 async/await 进行数组映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53109053/

相关文章:

javascript - 在 Ember Js 组件中定义转换 To

javascript - 注册 angularjs Controller 不返回任何内容

functional-programming - 如何在 F# 递归算法中正确返回生成的序列

algorithm - Scala/functional/without libs - 检查其他字符串排列是否

jquery - 处理异步请求的最佳方式是什么

javascript - 自调用匿名函数表达式

javascript - 如何通过单击表单的 "submit"按钮将数据从 HTML 保存到 Excel?

scala - 在 Scala 中进行柯里化(Currying) : multiple parameter lists vs returning a function

c# - 在 VSTO 中使用异步/等待跨线程操作无效

reactjs - React TypeScript 16.8 如何使 useEffect() 异步