使用wait.for和nodejs以及mongoskin来避免回调地狱

时间:2014-08-22 08:13:42

标签: node.js mongodb coffeescript mongoskin

我实际上用mongodb和nodejs开发了一个小应用程序来创建我的REST Api。 当我需要访问对象引用时遇到问题:

  • 我有一个引用用户对象的路线图集合
  • 当我想获得所有路线图时,我必须通过存储在路线图集合中的参考ID来循环我的路线图数组以延迟加载我的用户
  • 我有回调问题,我需要时没有加载用户

我找到了使用Wait.for库的解决方案:https://github.com/luciotato/waitfor,但我不知道它是如何工作的。我尝试了一切,但没办法让它发挥作用

all: (req,res)->
    @em.collection(@collection).find().toArray((err, result)=>
      roadmaps = []
      for r in result
        r.user = @getUser(r.user.oid)
        roadmaps.push r
      res.send(roadmaps))



 getUser: (oid)->
    @em.collection('user').findOne {_id: new @objectId(oid)}, (err, res)=>
      if !err
        return res
      return undefined

有人知道如何让它正常工作吗?我应该把wait.lauchFiber放在哪里?我应该把wait.for放在哪里?

全部谢谢

1 个答案:

答案 0 :(得分:0)

我不熟悉CoffeeScript,请纠正我,我会编辑这个答案。

all: (req,res)->
    var result = wait.forMethod(@em.collection(@collection).find(), "toArray")
    roadmaps = []
    for r in result
        r.user = @getUser(r.user.oid)
        roadmaps.push r
    res.send(roadmaps)



 getUser: (oid)->
    try
      return wait.forMethod(@em.collection('user'),"findOne",{_id:new @objectId(oid)})
    catch(err)
      return undefined

正如您所看到的,对于“getUser”,如果方法很简单,那么最好使用您的版本和回调。

“把launchFiber()放在哪里?”

您在请求到达时放入launchFiber。见https://github.com/luciotato/waitfor#proper-use

相关问题