【问题标题】:Promising an async function承诺异步功能
【发布时间】:2018-07-17 06:41:50
【问题描述】:

我有一个对象数组,我正在循环并以它们作为参数调用一个函数。这是一个 async/await 函数,我想创建一个 PromiseAll,它会在所有 async/await 调用结束时解析。我使用数组映射将它们转换为 Promise,但 Promise 会立即解析,并且不要等到所有 await 调用都已完成。

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 不是很熟悉。

【问题讨论】:

  • 我认为您不应该根据此处的文档在映射中调用 thendeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • runTest 函数中是否缺少 return 语句?
  • @sctskw 有或没有相同的问题。
  • @JamesIves 您仍然没有返回您在 runTest 中调用的匿名异步函数的结果。
  • 你不需要匿名异步函数

标签: javascript puppeteer


【解决方案1】:

您不需要我在 cmets 中已经提到的异步 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)}
}

【讨论】:

    【解决方案2】:

    我认为您可能在 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
            }
        })();
    }
    

    【讨论】:

      【解决方案3】:

      直截了当的方法:

      function launch() {
        return new Promise(function(resolve, reject) {
          setTimeout(resolve, 5000, 'blast off!')
        })
      }
      
      async function doSomething(id) {
        const message = await launch()
        return `${message} [${id}]`
      }
      
      
      let runs = [10, 20, 30].map(doSomething)
      
      Promise.all(runs).then(function(values) {
        console.log(values)
      })
      
      //outputs
      [ 'blast off! [10]', 'blast off! [20]', 'blast off! [30]' ]
      

      【讨论】:

        猜你喜欢
        • 2019-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-01
        相关资源
        最近更新 更多