承诺异步功能

时间:2018-07-16 22:23:11

标签: javascript puppeteer

我有一个对象数组,我正在遍历这些对象并以它们为参数调用函数。这是一个异步/等待功能,我想创建一个PromiseAll来解决所有异步/等待调用结束时的问题。我已经使用了数组映射将它们转换为Promise,但是Promise会立即解析,并且不要等到所有等待调用都完成。

async function runTest({_id, name, live, dev}) {
  (async () => {
    const browser = await puppeteer.launch();
    try {
     const page = await browser.newPage();

    } catch(error) {

     await browser.close()

    } finally {
     await browser.close()
     return
    }
   })();
}

module.exports = (tests) => {
  let testPromises = tests.map((test) =>  {
    return runTest(test).then(function (res) {
      return console.log(res, 'done')
    })
  });

  Promise.all(testPromises).then((data) => {
    console.log('Done resolving')
  }).catch(function(err){
  })
}

在解决PromiseAll之前,确保所有数组对象都已通过函数并完成处理的正确方法是什么?我对async / await不太熟悉。

3 个答案:

答案 0 :(得分:1)

您不需要异步IIFE,正如我在评论中已经提到的那样。可以像这样简化更多代码:

async function runTest({_id, name, live, dev}) {
  // we can have one try/catch since you close browser at any error
  try{
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
  }
  catch(error) {
    return await browser.close()
  }
}

module.exports = async (tests) => {
  try{
    const data = await Promise.all(tests.map(test => runTest(test)));
    console.log('Done resolving')
  }
  catch(e){ console.log(e)}
}

答案 1 :(得分:0)

我认为您可能在runTest中缺少return语句,尽管我不知道为什么首先需要匿名异步函数,例如@TheReason:

async function runTest({
    _id,
    name,
    live,
    dev
}) {
    return (async () => { // here
        const browser = await puppeteer.launch();
        try {
            const page = await browser.newPage();

        } catch (error) {

            await browser.close()

        } finally {
            await browser.close()
            return
        }
    })();
}

答案 2 :(得分:0)

直接的方法:

"${__FILE__}"