代码之家  ›  专栏  ›  技术社区  ›  James Ives

承诺异步函数

  •  0
  • James Ives  · 技术社区  · 8 年前

    我有一个循环的对象数组,并用它们作为参数调用一个函数。这是一个async/await函数,我想创建一个promiseall,它在所有async/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之前,如何确保所有数组对象都已通过函数并完成处理?我对异步/等待不是很熟悉。

    3 回复  |  直到 8 年前
        1
  •  1
  •   The Reason    8 年前

    你不需要我在评论中提到的异步生活。代码中的更多内容可以简化为:

    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
  •  0
  •   Hatchet    8 年前

    我认为您可能在runtest中丢失了一个return语句,但我不知道为什么首先需要匿名异步函数,比如@thereson提到的:

    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
  •  0
  •   sctskw    8 年前

    直截了当的方法:

    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]' ]