【问题标题】:How to return Return Promise from Array.reduce如何从 Array.reduce 返回 Return Promise
【发布时间】:2022-11-07 22:06:33
【问题描述】:

我正在使用Array.reduce 迭代一组对象并尝试从那里返回承诺。我在 reduce 方法中进行了一些修改,并且在对象中的 promise 解析后 reviewCards['departments'] 键具有修改后的数据,但 reviewCards['genders'] 为空。我认为所有的承诺都没有正确解决。

如何将最终对象作为 Promise 返回?

public getCompanyReviewCards(
   reviewGroups: ICompanyReviewGroups,
   reviews: CompanyReview[],
): Promise<[key: string]: ICompanyReviewCard> {
  
   return new Promise((resolve, reject) => { 
      const reviewCards = Object.keys(reviewGroups).reduce(
         async (reviewCards: ICompanyReviewCards, groupKey: string) => {

            const group = reviewGroups[groupKey];
            reviewCards['genders'] = reviewCards['genders'] || [];
            reviewCards['departments'] = reviewCards['departments'] || [];

            //Department wise cards
            //This block is excuting properyly
            if (groupKey === '_departmentGroup') {
                 const departmentsCards = await this.getCardsByDepartments(group);
                 reviewCards['departments'] = departmentsCards;
            }

            //Gender wise cards
            //This block is not excuting properyly
            if (groupKey === '_genderGroup') {
                 const gendersCards = await this.getCardsByGender(group);
                 reviewCards['genders'] = gendersCards;
            }

            return reviewCards;

         },Object.create(null),
      );

   resolve(reviewCards);

   })
}

【问题讨论】:

    标签: javascript types promise


    【解决方案1】:

    如果你返回一个承诺,你也必须等待它:`await reviewCards"

    【讨论】:

    • 我需要在哪里使用await,你能解释一下吗?
    【解决方案2】:

    reduce 不知道承诺,也不会自动处理你的承诺,所以你必须自己做。请记住,回调的第一个参数是从上一次迭代返回的值,这将是一个承诺。

    const main = async() => {
      const generateNumber = () => {
        return new Promise(resolve => setTimeout(() => resolve(Math.random()), 1000));
      };
    
      const data = ['a', 'b', 'c'];
      const promiseReducedData = data.reduce(async(previousValuePromise, currentValue, index) => {
        const resolvedPreviousValue = await previousValuePromise;
        console.log(`Working on index ${index}`);
        const newValue = {
          ...resolvedPreviousValue,
          [currentValue]: await generateNumber()
        };
        return newValue;
      }, {});
      const reducedData = await promiseReducedData;
      console.log(reducedData);
    };
    
    main();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2018-10-09
      • 2017-12-20
      • 1970-01-01
      • 2019-06-26
      • 2020-03-28
      • 1970-01-01
      相关资源
      最近更新 更多