我有一个函数,我想用它来从历史数据开始,从以太网交易开始在gdax交易所开始到当前。我希望代码轮询100个结果(一次最大允许)将结果插入mongodb,添加100,然后重复,直到我获得所有历史数据。但是,我写的是以不同的顺序执行。首先,它将for for next中的所有数字相加,然后执行所有http authedclient请求(尽管它正确地使用了为每个请求添加100的变量),然后将所有数据丢弃到mongodb中。我遇到的问题是,当数据插入mongodb客户端时,连接已关闭。如何按照我想要的顺序执行每个操作?贴在下面的贴纸。请注意我使用的代码已经发生了显着变化以适应其他错误,将插入循环更改为insertMany但是如果有人可以提供帮助,我可以正确地集成建议。提前谢谢。
https://pastebin.com/1BHi9RQV
var i = 100;
for (; i < 18750000; ) {
publicClient.getProductTrades({ after: i }, function (err, response, data) {
if (err) {
console.log(err);
return;
}
MongoClient.connect(url, function (err, db) {
if (err) {
console.log(err);
return;
}
var myobj = { data };
for (item in data) {
db.collection("EthTest").insertOne(data[item], function (err, res) {
if (err) {
console.log(err);
return;
}
});
console.log(data[item].trade_id);
}
db.close();
});
});
i = i + 100;
};
还下载了堆栈应用以正确发布链接和代码。移动网站不允许我这样做。遗憾!
答案 0 :(得分:1)
不要将db.close();
放入for
循环中。只有在完成所有插入操作后才能调用它。
如果此顺序非常重要(获得100个结果,存储它们等等),我建议您将此代码拆分为2个相互调用的函数。 这样的事情:
var i = 100;
var mongo;
function getData() {
publicClient.getProductTrades({ after: i }, function (err, response, data) {
if (err) {
console.log(err);
return;
}
i = i + 100;
saveData(data);
});
}
function saveData(data) {
var keys = Object.keys(data);
// loop through the data
for (j = 0, end = keys.length; j < end; j++) {
db.collection("EthTest").insertOne(data[item], function (err, res) {
if (err) {
console.log(err);
return;
}
console.log(data[item].trade_id);
if (keys[j] === keys[keys.length-1]) {
// last item in data was inserted
if (i < 18750000) {
// get the next 100 results if there's any
getData();
} else {
mongo.close();
}
}
});
};
}
MongoClient.connect(url, function (err, db) {
if (err) {
console.log(err);
return;
}
mongo = db;
getData();
});
或者我当然不能为你测试,但我希望你明白这一点。
另一种选择是分离您的2个异步调用。 让第一个循环得到所有数据(一次100个),将它们存储在一个数组中,一旦完成,循环遍历该数组并将数据插入Mongo。