2017-06-13 72 views
0

如何检测async.Each何时完成循环加载到参数中的所有对象/数组。如何调用ALL FINISH日志。nodejs mongodb async.Each done

db.collection('tests').find(query).limit(10).toArray(function(err, db_results) { 
    console.log("count: "+db_results.length); 

    async.each(db_results, function (db_resultsx, cb) { 
     db_resultsx._id = db_resultsx._id.toString(); 
     db_resultsx.xdate_visited = moment(db_resultsx.date_visited).format("YYYY-MM-DD hh:mm:ss"); 
     documents.push(db_resultsx); 

    }, function(documents) { 
      console.log(documents); 
      console.log(documents.length); 
      console.log("ALL FINISH"); 
      process.exit(); 
    }); 

}); 

回答

1

没有理由使用async.each()因为它应该运行的代码是不同步的。

相反,你可以使用.map()

db.collection("tests").find(query).limit(10).toArray(function(err, db_results) { 
    console.log("count: " + db_results.length); 

    let documents = db_results.map(function(db_resultsx) { 
    db_resultsx._id = db_resultsx._id.toString(); 
    db_resultsx.xdate_visited = moment(db_resultsx.date_visited).format(
     "YYYY-MM-DD hh:mm:ss" 
    ); 
    return db_resultsx; 
    }); 

    console.log(documents); 
    console.log(documents.length); 

    curl(URL, { data : documents }, function(err) { 
    console.log("ALL FINISH"); 
    process.exit(); 
    }); 
}); 
+0

我没有指定,我做了卷曲它完成每个循环,过度发新的文件之后。 – Boy

+0

@Boy你的意思是你在_all_文件处理完成后执行卷曲,或者分别为每个文件执行卷曲? – robertklep

+0

所有文件处理完毕后 – Boy

2

的原因,async.each功能未完成的回调不被称为第二函数内。我创建了一个简单的示例,但没有使用mongo调用,而是使用超时。

如果你看文档https://caolan.github.io/async/docs.html#each第二个参数是一个回调(在你的代码中,这是值cb),需要调用它来表示你正在运行的代码的末尾。

function delayedReturn(callback) { 
 
    setTimeout(function(){ 
 
    console.log('timeout complete'); 
 
    callback(false, ['first value']); 
 
    }, 1000); 
 
} 
 
var documents = []; 
 
delayedReturn(function(err, db_results) { 
 

 
    async.each(db_results, function (dbResult, cb) { 
 
     
 
     documents.push(dbResult); 
 
     console.log('documents pushed', dbResult) 
 
     cb(); 
 

 
    }, function(error) { 
 
     if(error) 
 
     { 
 
      console.error(error); 
 
     } 
 
      
 
    }); 
 
});
<script src="https://rawgit.com/caolan/async/master/dist/async.min.js"></script>