Javascript 节点异步控制流

Javascript 节点异步控制流,javascript,node.js,Javascript,Node.js,我试图在node中处理twitter数据,但遇到了一些我认为应该与节点样式编码相关的障碍。这段代码旨在抓取推文,检查文本是否在mongo中,如果不是,则插入 我发现的第一个障碍是,在尝试将I打印到控制台时,它总是在开始遍历光标之前遍历每个I。我想如果我能澄清这一点,它可能会帮助我前进。这些信息足以帮助我吗 我得到的是: T.get('statuses/user_timeline', options , function(err, data) { var db = MongoClien

我试图在node中处理twitter数据,但遇到了一些我认为应该与节点样式编码相关的障碍。这段代码旨在抓取推文,检查文本是否在mongo中,如果不是,则插入

我发现的第一个障碍是,在尝试将I打印到控制台时,它总是在开始遍历光标之前遍历每个I。我想如果我能澄清这一点,它可能会帮助我前进。这些信息足以帮助我吗

我得到的是:

T.get('statuses/user_timeline', options , function(err, data) {

     var db = MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
        if(err)
            throw err;
        console.log("connected to the mongoDB !");
        myCollection = db.collection('test_collection2');

        for (var i = 0; i < data.length ; i++) {
            //let's wrap this in a loop
            docu = data[i];
            //console.dir(data);
           console.dir(i);
           var cursor = myCollection.find({text : data[i].text}).limit(1);
           cursor.each(function(err, doc) {
              if (doc != null) {
                    console.dir('doc is not null');
                    console.dir(doc.text);
              } else {
                    console.dir('doc is null - inserting');
                    myCollection.insert(docu, function(err, records){
                       console.log("Record added as "+records.text);
                       });
              }
           })
        }
    });
})
T.get('status/user_timeline',选项,函数(err,data){
var db=MongoClient.connect('mongodb://127.0.0.1:27017/test,函数(err,db){
如果(错误)
犯错误;
log(“连接到mongoDB!”);
myCollection=db.collection('test_collection2');
对于(变量i=0;i
问题只是因为Javascript是异步的。循环在Mongo中的find函数给出返回值之前完成

我会做以下或类似的事情——只是为了解释这个概念:

T.get('statuses/user_timeline', options , function(err, data) {

 var db = MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
    if(err)
        throw err;
    console.log("connected to the mongoDB !");
    myCollection = db.collection('test_collection2');

    var myfunction = function(correct_i,docu){
      var cursor = myCollection.find({text : data[correct_i].text}).limit(1);
       cursor.each(function(err, doc) {
          if (doc != null) {
                console.dir('doc is not null');
                console.dir(doc.text);
          } else {
                console.dir('doc is null - inserting');
                myCollection.insert(docu, function(err, records){
                   console.log("Record added as "+records.text);
                   });
          }
       })
    };

    for (var i = 0; i < data.length ; i++) {
        //let's wrap this in a loop
        docu = data[i];
        //console.dir(data);
       console.dir(i);
       myfunction(i,docu);

    }
    });
})
T.get('status/user_timeline',选项,函数(err,data){
var db=MongoClient.connect('mongodb://127.0.0.1:27017/test,函数(err,db){
如果(错误)
犯错误;
log(“连接到mongoDB!”);
myCollection=db.collection('test_collection2');
var myfunction=函数(正确,docu){
var cursor=myCollection.find({text:data[correct_i].text}).limit(1);
游标。每个(函数(错误、文档){
如果(doc!=null){
console.dir('doc不为null');
console.dir(doc.text);
}否则{
console.dir('文档为空-插入');
myCollection.insert(文档、函数(错误、记录){
console.log(“记录添加为”+records.text);
});
}
})
};
对于(变量i=0;i

这样,Mongo的每个查找/查找都将具有正确的i。因为函数将其作为参数获取

myCollection.find(…).limit(…)
应该返回什么?它真的是一个游标,还是在请求完成时解析的承诺?游标。尽管如此,即使我现在不能测试,它很可能会在
游标
用于迭代之前返回
.find
。最好的做法是使用
…find({…},function(err,res){…}).limit(1)文档似乎建议使用
cursor.toArray(函数(err,doc){…})
),但我不知道API的行为,所以只要我的2美分…你就可以将回调传递到
。find
,@giuscri的注释可能是更干净的解决方案