【问题标题】:loop not working properly in node js循环在节点 js 中无法正常工作
【发布时间】:2017-12-23 13:38:03
【问题描述】:

我是 nodejs 的新手,因为循环不能同步工作。请帮忙提前谢谢

这是我的代码

 notifyRide:function*(body){
  yield User.find({_id: {$ne: body.userId}},function(err, doc){
   if(doc != null){
    User.findOne({_id:body.userId},function(err, user){
     Ride.findOne({_id : body.rideid},function*(err1,ride){
      for (var i = 0; i < doc.length; i++) {
       console.log(i)// getting 0
       yield rideStatus.findOne({$and:[{receiver_id:doc[i]._id},{ride_id:body.rideid}]}, function(err, response)
       {
         console.log(i);//getting 1
       })
      }
     })
   })
  }
})

}

【问题讨论】:

  • 下面的my answer 对您有帮助吗?有没有cmets?

标签: node.js mongoose koa


【解决方案1】:

既然您似乎在使用基于生成器的协程,为什么不使用 Mongoose 方法返回的承诺?见:

例如,而不是:

Ride.findOne({_id : body.rideid}, function*(err1,ride) ...

你可以使用:

let ride = yield Ride.findOne({_id : body.rideid});

并避免嵌套函数。否则,您生成的东西不是来自正确的生成器,并且生成的值会被忽略。

如果你想使用基于生成器的协程,还要确保你需要正确地包装你的生成器函数。例如:

notifyRide:function*(body) {
  // ...
}

应该是co

notifyRide: co.wrap(function* (body) {
  // ...
})

或与 Bluebird 一起使用:

notifyRide: P.coroutine(function* (body) {
  // ...
})

您也可以使用asyncawait

notifyRide: async (body) => {
  // ...
  // use 'await' instead of 'yield'
}

注意协程本身总是返回 Promise。

看在上帝的份上,请使用一些缩进。我强烈建议您遵循像 Airbnb 这样的体面风格指南:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 2017-11-08
    • 2019-01-01
    相关资源
    最近更新 更多