【问题标题】:Reduce return empty array减少返回空数组
【发布时间】:2021-12-19 08:38:00
【问题描述】:

activeUsers - 猫鼬对象数组 activeUsers.campaings - 猫鼬对象数组 LandingsFromBinom - 存储 id [{id: 123, name: name}, {id: 133, name: name2}] 的对象数组

对于每个用户,我都有活动数组(mongoose doc),对于每个活动,我都有 langings 数组(mongoose doc)。

我从 db 中获取所有用户并开始为每个用户进行迭代。 对于每个广告系列,我都会获取“着陆”并开始为每个广告系列进行迭代。

查看 db 并比较我需要更改的 id 并将其值存储在“landingsIds”中

问题:当我控制台日志“数据”返回我空数组,但如果我 console.log 函数返回填充数组。如何解决?

 // Fetch users from db
  let activeUsers = await User.find().populate({
    path: 'campaigns',
    match: { active: true },
  })

  const data = activeUsers.reduce((results, user) => {
    // For each campaign get landings
    user.campaigns.forEach(async (campaign) => {
      const { landings } = await campaign.populate({
        path: 'landings',
        match: { active: true },
      })

      // Get only good ID
      const landingsIds = landings.reduce((results, landing) => {
        landingsFromBinom.forEach((binomLanding) => {
          if (
            parseInt(binomLanding.id) === landing.id &&
            binomLanding.inject >= landing.todayVisitors
          ) {
            results.push(landing.id)
          }
        })
        return results
      }, [])

      results.push({
        landings: landingsIds,
        user: user._id
      })
      // RETURN Filled array
      console.log(results)
    })
    return results
  }, [])

  // Return empty array
  console.log(data)

输出

[]
[
  {
    landings: [ 3, 11, 1, 7 ],
    user: new ObjectId("617fb23b1e7ea187ae07a6ee")
  }
]

【问题讨论】:

    标签: node.js arrays asynchronous mongoose


    【解决方案1】:

    array.reduce 中使用 await 和 Promise.resolve

    let activeUsers = await User.find().populate({
        path: 'campaigns',
        match: { active: true },
      })
    
      const data = await activeUsers.reduce(async (results, user) => {
        // For each campaign get landings
        user.campaigns.forEach(async (campaign) => {
          const { landings } = await campaign.populate({
            path: 'landings',
            match: { active: true },
          })
    
          // Get only good ID
          const landingsIds = landings.reduce((results, landing) => {
            landingsFromBinom.forEach((binomLanding) => {
              if (
                parseInt(binomLanding.id) === landing.id &&
                binomLanding.inject >= landing.todayVisitors
              ) {
                results.push(landing.id)
              }
            })
            return results
          }, [])
    
          results.push({
            landings: landingsIds,
            user: user._id
          })
          // RETURN Filled array
          console.log(results)
        })
       
      }, [], Promise.resolve(results))
    
      console.log(data)
    

    【讨论】:

    • 返回未定义
    • 再试一次我更新我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2020-05-30
    • 2022-01-02
    • 2021-02-05
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多