2016-09-21 72 views
0

我在理解回调的行为时遇到了一些麻烦。 例如,以下代码无法按预期的方式工作。 我试过异步库,但没有获得所需的行为。Nodejs + Express + mysql回调问题

module.exports.list = function (req, res) { 
    model.list(id, idx, function(boo){ 
     async.forEachOf(boo, function (b, k, e) { 
      model.sublist(b.text, function(foo) { 
       b.foo = foo; 
      }) 
     }) 
     res.json({ data : boo }) //boo dont have foo porperty 
    }); 
}; 

model.list = execute some big mysql query, and return rows (boo is an array). 
model.sublist = same as model.list 

编辑解决方案:

module.exports.list = function (req, res) { 
    model.list(id, idx, function(boo){ 
     async.forEachOf(boo, function (b, k, e) { 
      model.sublist(b.text, function(foo) { 
       b.foo = foo; 
       e(); 
      }) 
     }) 
     res.json({ data : boo }) 
    }); 
}; 
+0

可能重复[为什么我的变量在函数内部修改后没有改变? - 异步代码引用](http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron) –

+0

应该移动' res.json(...)'到第二个回调中,在'model.sublist'之后# – tmquang6805

+0

WHY节点框架给你一个响应对象,你可以发送消息而不是让你的函数返回一个值(框架通常工作的方式在其他语言中)完全是这样,你可以异步获取数据,然后发送响应。所以只需在正确的地方发送回复,而不是在收到之前。 – slebetman

回答

2

应呼叫响应仅在第2个回调。 read async documentation

module.exports.list = function (req, res) { 
    model.list(id, idx, function(boo){ 
     async.forEachOf(boo, function (b, k, e) { 
      model.sublist(b.text, function(foo) { 
       b.foo = foo; 
      }); 
      e(); 
     },function(){ 
      res.json({ data : boo }) //boo dont have foo porperty 
     }); 
    }); 
} 
+0

e()在子列表回调结束前执行,所以b.foo = undefined,我怎么能实现这个? – 9879800

+0

感谢你们所有人 – 9879800