在异步循环后,(NODEJS)数组为空

时间:2016-08-08 08:45:01

标签: node.js promise

_processInstructionItems(employerId, programs)
{
    return new Promise((resolve, reject) => {
        let self = this;
        let listOfPrograms = [];
        _.forEach(programs, item => {
            Program.find(item.id).then(programData => {
                this._processProgramItemCode(employerId, item, programData).then(programItem => {
                    listOfPrograms.push(programItem)
                })
            }).catch(err => {
                console.log(err);
            })
        })
        resolve(listOfPrograms)
    })
}

示例有效负载

return {
    user_id: 'ADMIN_TEST',
    employer_id: '202693450004',
    programs: [
      {
        id: 1,
        period: [
          {
            date: '2016-07-01'
          },
          {
            date: '2016-08-01'
          }
        ]
      },
      {
        id: 4,
        period: [
          {
            date: '2016-09-01'
          },
          {
            date: '2016-10-01'
          }
        ]
      }
    ]
  }

我想知道为什么在推送promise中的解析数据之后数组仍然是空的。

注意:我仍然是这种语言的新手,所以请耐心等待。谢谢!

2 个答案:

答案 0 :(得分:1)

这是因为查找是异步的,你立即解决了空数组。 正确的代码应该是这样的:

_processInstructionItems(employerId, programs)
    {
      let self = this;
      let listOfPrograms = [];
      return Program.find({_id: {$in: _.map(programs, 'id')}})
      .then(programsData =>
            {
        let promises = programsData.map(p => this._processProgramItemCode(employerId, p);
        return Promise.all(promises);
      }).catch(err => {
        console.log(err);
      })
    })
}

答案 1 :(得分:0)

我对使用promises并不是很熟悉,但看起来你希望你的listOfPrograms包含你通过异步调用添加的东西;只要某些东西是异步的,你的代码就会立即“掉进”resolve()函数调用,但你的数组仍然是空的。

很难判断这个东西中的函数是实际上是同步还是异步,但是如果你调用的是任何函数,那么你所描述的行为就是预期的。

几个星期前,我写了一些东西,用node.js激发了我(来自C ++ / C#中的桌面开发),也许这对你有帮助:Codepen

特别是带有async for循环的位看起来与你在这里描述的非常相似。