javascript 数组reduce方法+ promises

9gm1akwq  于 2023-10-14  发布在  Java
关注(0)|答案(2)|浏览(117)

我有一个函数,它从当前路径获取数据以创建一个数组([x,y,z,a,B]),然后将其传递给reduce方法以返回一个新的对象数组。我想把初始数组中的每个值都传入一个函数,该函数返回一个对象,然后把该对象添加到新数组中。然而,在它结束后,我console.log accumulate没有任何东西被打印出来,我如何使用promise来完全显示accumulate的结果?

let accumulate = path.search
      .substring(1)
      .split("+")
      .reduce((acc, val) => {
        FetchMovie(val).then((res) => {
          acc.push(res);
        });
        return acc;
      }, []);
5cg8jx4n

5cg8jx4n1#

传递给.then()的方法是异步执行的,所以acc直到reduce操作完成后才被填充(这太晚了)。你可以使用Promise.all(),首先将所有值Map(.map())到FetchMovie函数返回的Promise:

const accumulatedPromise = Promise.all(path.search
  .substring(1)
  .split("+").map(val => FetchMovie(val))
);

accumulatedPromise
  .then(results => console.log(results))
  .catch(err => console.error(err));
ki0zmccv

ki0zmccv2#

你不能在reducer中使用promise,除非你先解决所有的promise。一个简单的方法是拆分字符串,返回新的Promise,然后等待所有的Promise完成。
下面是一个示例:

const lst = [1, 2, 3, 4, 5, 6]; // results after your `split`

Promise.all(
  // replacing `reduce` for `map`
  lst.map(val => FetchMovie(val))
).then(
  // log the new array
  newArray => console.log(newArray)
)

相关问题