Filtrar una matriz con una función que devuelve una promesa

Dado

let arr = [1,2,3];

function filter(num) {
  return new Promise((res, rej) => {
    setTimeout(() => {
      if( num === 3 ) {
        res(num);
      } else {
        rej();
      }
    }, 1);
  });
 }

 function filterNums() {
   return Promise.all(arr.filter(filter));
 }

 filterNums().then(results => {
   let l = results.length;
   // length should be 1, but is 3
 });

La longitud es 3 porque se devuelven Promesas, no valores. ¿Hay alguna manera de filtrar la matriz con una función que devuelve una Promesa?

Nota: Para este ejemplo, fs.stat ha sido reemplazado por setTimeout, veahttps://github.com/silenceisgolden/learn-esnext/blob/array-filter-async-function/tutorials/array-filter-with-async-function.js para el código específico

Respuestas a la pregunta(9)

Su respuesta a la pregunta