CNode

for循环语句里面的异步操作怎么写?

Ssongbo发布于13 年前最后回复13 年前10 回复19695 浏览0 收藏

有一个数组results1,从数组取出每个数循环去查询数据库判断是否存在..如果存在添加到另一个参数data中, 最后循环操作完毕 把data2发送到前端。 已知数组results var telephone = results[0]; var data=''; for( i = 1; i < results1.length; i++) { var recto=telephone.substr(0,7); mobileModel.Mobile.findOne({'YJPhone':recto},function(err,mresult){ if(mresult){ data+=recto; } }

} res.send(data); 因为查询数据库是异步操作,data发送时为空;怎么取改写上面的代码?

查看回复

回复 (9)

J
jiyinyiyong#1·13 年前

eventproxy +1

简单的方案是每次取回数据以后手动标记, 用来判断是否对应 result1 次操作已经完成

S
suinia#2·13 年前

把操作放入数组func然后用async.parallel也可以吧? each(results1 ,function(results){func.push(function(callbak){...}}) async.parallel(func,function()...

L
lellansin#3·13 年前

推荐一篇博文,关于 async 的:http://freewind.me/blog/20120515/917.html

B
blacktail#4·13 年前

用async吧

C
clamingo#5·13 年前

用promise, like this

function db(req, res){
  var ps = [];
  for(var k in models){
    (function(k){
      ps.push(
        models[k].find().exec().then(function(v){
          return {collection: k, data: v};
        })
      );
    })(k);
  }
  Q.all(ps).then(function(a){
    res.send(a);
  }, function(){
    res.send('未知错误');
  });
}
T
taomeejack#6·13 年前

用闭包

H
hongxin#7·13 年前

是这样吧, var telephone = results[0]; results1.forEach(function (result){ var recto=telephone.substr(0,7); mobileModel.Mobile.findOne({'YJPhone':recto},function(err,mresult){ if(mresult){ data+=recto; } } }

R
ronincn#8·13 年前

async

Z
zensh#9·13 年前

我在另一个贴中的回复: http://cnodejs.org/topic/524558f6f29c7bbd3c5c63c8

then.js的写法如下:

// url_list 为数组
then.each(url_list, function (defer, url) {
    request(url, function (err, res, json) {
        defer(err, json)
    })
}).then(function (defer, result) {
    // result 就是url获取的json结果数组,顺序与url对应
}).fail(function (defer, err) {
    // 处理 err
})

https://github.com/teambition/then.js 目前teambition.com前端和angularjs.cn的后端采用的then.js

参与回复
登录后即可参与回复。登录