for循环语句里面的异步操作怎么写?
发布于 1年前 作者 songbo 1675 次浏览

有一个数组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发送时为空;怎么取改写上面的代码?

10 回复

可以看看eventproxy这类的模块吧。

是这样吧, 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; } } }

eventproxy +1

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

我在另一个贴中的回复: 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

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

用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('未知错误');
  });
}
回到顶部