【问题标题】:Having an issue with order of operations in node.js functionnode.js 函数中的操作顺序存在问题
【发布时间】:2018-05-19 08:07:30
【问题描述】:

我有一个功能,我想用它来轮询从 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;

};

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

【问题讨论】:

  • 请在问题本身中包含相关代码。有些人可能无法访问 Pastebin,或者链接可能会断开。在此处阅读有关提出好问题的更多信息:stackoverflow.com/help/how-to-ask
  • 我试过了,我会在家里,在手机上编辑,我似乎无法访问代码工具栏,也无法按 Ctrl + k

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


【解决方案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。

【讨论】:

  • 那么执行的订单呢?这也会纠正操作顺序吗?我仍然希望代码执行 authedclient (publicclient) 操作,然后插入 DB,然后添加 100。但是代码一次执行每个命令。
  • 有 2 个循环和 2 个异步调用,混淆是正常的。让我想办法让它更干净。
  • 欣赏它。谢谢。
  • 看起来像我需要的。我回家后会测试,谢谢你的时间。这是我第一个使用 js、node 和 mongodb 的项目,所以经历了一些试验和错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多