我正在使用mongodb和bigquery的nodejs。nodejs如何讓循環等待,直到運行循環的下一個實例
因爲它似乎bigquery只允許每個命令10k插入。
所以我做了主要查詢計數,並循環到從10K多少頁。
我得到500k與計數查詢,所以50頁或500循環。
如何讓循環等待直到運行循環的下一頁?
代碼:
var limit = 9999;
mongo_client.connect(mongo_url, function(err, db) {
var query = {'_id.date_visited':{'$gte':'2016-01-01','$lt':'2016-02-01'}};
db.collection('my_table').count(query,function(err, count){
var pages = Math.ceil(count/limit);
console.log("count: "+count);
console.log("pages: "+pages);
for(var page=0;page<pages;page++){
var skip = page * limit;
console.log("page: "+page);
console.log("skip: "+skip);
//HOW TO MAKE THIS loop wait till running next page of the loop
db.collection('my_table').find(query).sort({'_id.date_visited':1,'_id.hour_visited':1}).limit(limit).limit(skip).toArray(function(err, db_results) {
var documents = [];
async.each(db_results, function (db_resultsx, cb) {
documents.push(db_resultsx);
if(documents.length == db_results.length) {
//console.log(documents);
bigqueryClient
.dataset(dataset)
.table('my_table')
.insert(documents)
.then((insertErrors) => {
console.log('Inserted');
//documents.forEach((row) => console.log(row));
console.error(insertErrors);
if (insertErrors && insertErrors.length > 0) {
console.log('Insert errors:');
insertErrors.forEach((err) => console.error(err));
}
})
.catch((err) => {
console.error('ERROR:');
console.log(err);
});
}
});
});
}
});
});
那麼你已經在使用['async.each'](http://caolan.github.io/async/docs.html#each)了。看到這行'async.each(db_results,function(db_resultsx,cb){'''''''當你想要發信號通知循環的下一次迭代時,''cb''要小心,因爲你有'if'語句放在另一個異步方法之前,所以你應該在完成異步方法(bigQuery)以及需要與if匹配的else條件中調用該「回調」,否則我們不會發送信號 –