我正在节点中编写一个小脚本,它通过Monk适配器从MongoDB中获取一些数据,我真的无法弄清楚为什么订单不是我所期待的。
不过,我对Promise的了解并不是很先进:我正在使用的代码
function bigRetry(){
return users.find({merchant : true}).then(function(merchants){
merchants.forEach(function(merchant){
console.log('I see a company: '+ merchant.company);
return jobs.find({_p_merchant: '_User$' + merchant._id}).then(SO);
})
})
}
function SO(jobs){
jobs.forEach(function(job){
console.log('I see a job: '+ job.title);
});
}
我期待的是:
I see a company: JobNinja GbR
monk:queries Job find {"_p_merchant":"_User$jWDNE5b2er"} +0ms
I see a job: Praktikum Maler und Lackierer
I see a company: Freelance
monk:queries Job find {"_p_merchant":"_User$rQzEyiELOH"} +1ms
I see a job: Praktikum Maler und Lackierer
I see a company: JobNinja
monk:queries Job find {"_p_merchant":"_User$27HMaVzZfd"} +1ms
I see a job: Praktikum Maler und Lackierer
I see a company: Shore.com
monk:queries Job find {"_p_merchant":"_User$4doj3eR5kC"} +0ms
I see a job: Praktikum Maler und Lackierer
我有什么:
I see a company: Freelance
monk:queries Job find {"_p_merchant":"_User$rQzEyiELOH"} +1ms
I see a company: JobNinja
monk:queries Job find {"_p_merchant":"_User$27HMaVzZfd"} +1ms
I see a company: Shore.com
monk:queries Job find {"_p_merchant":"_User$4doj3eR5kC"} +0ms
I see a job: Praktikum Maler und Lackierer
I see a job: Promoter/in
I see a job: Koch / Jungkoch ab sofort gesucht
如果有人可以解释为什么在公司查询后显示作业的查询并且没有“嵌套”,那对我有帮助。
最佳,
答案 0 :(得分:1)
从讨论中复制
因为在这行merchants.forEach(function(merchant){
中你再次进入异步javascript的奇妙世界:)
但是,严重的是,您同时在循环中调用多个异步函数。
您正在寻找的是一种承诺顺序流量控制机制。
蓝鸟的Promise.each
可能是其中之一,或者你可以自己编写。
Promise.all
是ES6标准https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all的一部分。然而,这不是你想要的。它将帮助您从bigRetry
返回承诺,但无论如何执行都不会发生
备选方案你可以看一下co
https://www.npmjs.com/package/co,它与promises的效果非常好,实际上是生成器执行器的实现,它会让你的代码更简单,最有可能你赢了#39 ; t需要使用蓝鸟