承诺清单:需要有关订单的说明

时间:2016-05-04 18:10:15

标签: node.js mongodb promise

我正在节点中编写一个小脚本,它通过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

如果有人可以解释为什么在公司查询后显示作业的查询并且没有“嵌套”,那对我有帮助。

最佳,

1 个答案:

答案 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需要使用蓝鸟