-2

我有一个功能,我想用它来轮询从 gdax 交易所上以太坊交易开始到当前的历史数据。我希望代码轮询 100 个结果(一次最多允许)将结果插入 mongodb,添加 100,然后重复,直到获得所有历史数据。但是,我所写的执行顺序不同。首先它将 for next 中的所有数字相加,然后执行所有 http authedclient 请求(尽管它正确使用了为每个请求添加 100 的变量),然后将所有数据放入 mongodb。我遇到的问题是,当数据插入 mongodb 客户端时,连接已关闭。我怎样才能让它按照我想要的顺序执行每个操作?Pastebin 贴在下面。请注意,我使用的代码已发生重大更改以适应其他错误,将插入循环更改为 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;

};

还下载了堆栈应用程序以正确发布链接和代码。移动网站不允许我这样做。对不起!

4

1 回答 1

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。

于 2017-12-05T15:49:01.117 回答