Filtering an array with a function that returns a promise Filtering an array with a function that returns a promise arrays arrays

Filtering an array with a function that returns a promise


Here is a 2017 elegant solution using async/await :

Very straightforward usage:

const results = await filter(myArray, async num => {  await doAsyncStuff()  return num > 2})

The helper function (copy this into your web page):

async function filter(arr, callback) {  const fail = Symbol()  return (await Promise.all(arr.map(async item => (await callback(item)) ? item : fail))).filter(i=>i!==fail)}

Demo:

// Async IIFE(async function() {  const myArray = [1, 2, 3, 4, 5]  // This is exactly what you'd expect to write   const results = await filter(myArray, async num => {    await doAsyncStuff()    return num > 2  })  console.log(results)})()// Arbitrary asynchronous functionfunction doAsyncStuff() {  return Promise.resolve()}// The helper functionasync function filter(arr, callback) {  const fail = Symbol()  return (await Promise.all(arr.map(async item => (await callback(item)) ? item : fail))).filter(i=>i!==fail)}