我有一个对象数组,我正在遍历这些对象并以它们为参数调用函数。这是一个异步/等待功能,我想创建一个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不太熟悉。
答案 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__}"