Javascript 带有异步等待的数组reduce函数

Javascript 带有异步等待的数组reduce函数,javascript,async-await,Javascript,Async Await,我试图从基于异步运算符的数组对象中跳过一个对象。我尝试了以下情况,但得到了一个类型错误 试验方法1 newObjectArray = await Promise.all(objectAray.reduce(async (result, el) => { const asyncResult = await someAsyncTask(el); if (asyncResult) { result.push(newSavedFile); } return result

我试图从基于异步运算符的数组对象中跳过一个对象。我尝试了以下情况,但得到了一个类型错误

试验方法1

newObjectArray = await Promise.all(objectAray.reduce(async (result, el) => {
  const asyncResult = await someAsyncTask(el);
  if (asyncResult) {
      result.push(newSavedFile);
  }
  return result;
}, []));
试验方法2

newObjectArray = await Promise.all(objectAray.reduce(async (prevPromise, el) => {
  const collection = await prevPromise;
  const asyncResult = await someAsyncTask(el);
  if (asyncResult) {
      prevPromise.push(newSavedFile);
  }

  collection.push(newSavedFile);
  return collection;
}, Promise.resolve([])));
错误

“类型错误:#不可编辑”,
“at Function.all()”,

在您的第一次尝试中,
结果
是一个承诺,因为所有的
异步
函数在调用时都评估为一个承诺,因此您必须
等待结果
才能推送到数组,然后您就不需要承诺了。全部:

 newObjectArray = await objectAray.reduce(async (result, el) => {
  const asyncResult = await someAsyncTask(el);
  if (asyncResult) {
    (await result).push(newSavedFile);
  }
  return result;
}, []);
但我想,事后只进行过滤要快得多:

 newObjectArray = (await Promise.all(objArray.map(someAsyncTask))).filter(el => el);

您能解释一下所需的输出是什么吗?在数组上进行两次迭代时,is Not filter将花费您多少纳秒的时间。@ankit yup bat这可能会花费您几纳秒的时间,而执行一个又一个
someAsyncTask
将花费您更多的时间。只需在这之前和之后加上一个
Date.now()
,看看两者的表现……谢谢你的回答。当我简化为Object时,不可能使用Promise.all()。所以我喜欢你的答案,这有助于达到这个目的:)谢谢!
 newObjectArray = (await Promise.all(objArray.map(someAsyncTask))).filter(el => el);