在node.js函数中遇到操作顺序问题

时间:2017-12-05 15:40:59

标签: javascript node.js mongodb api gdax-api

我有一个函数,我想用它来从历史数据开始,从以太网交易开始在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;

};

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

1 个答案:

答案 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。