_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中的解析数据之后数组仍然是空的。
注意:我仍然是这种语言的新手,所以请耐心等待。谢谢!
答案 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循环的位看起来与你在这里描述的非常相似。