2017-12-05 23 views
-2

gdax交換のEthereum取引の開始から現在まで履歴データをポーリングするために使用したい機能があります。 100回結果をポーリングして(一度に最大許容)、mongodbに結果を挿入し、100を加えてから、すべての履歴データが得られるまで繰り返します。しかし、私が書いたことは、別の順序で実行されています。まず、forの中のすべての数字を合計し、すべてのhttp authedclientリクエストを実行します(各リクエストに100を加えた変数を適切に使用します)。そして、すべてのデータをmongodbにドロップします。私が抱えている問題は、データがmongodbクライアントに挿入されるまでに接続が閉じられることです。私はそれを私が望む順序で各操作を実行するためにどのように得ることができますか?ペーストビンは以下の通りです。私が使用するコードは、他のエラーに対応するために大幅に変更されていることに注意してください。insertループをinsertManyに変更しましたが、誰かが助けてくれれば適切に提案を統合できます。前もって感謝します。
https://pastebin.com/1BHi9RQVnode.js関数の操作順序に問題がある

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

質問自体に関連コードを含めてください。一部の人がペーストビンにアクセスできない場合や、リンクが壊れる場合があります。ここで良い質問をしてください:https://stackoverflow.com/help/how-to-ask –

+0

私は試してみましたが、私は自宅で、モバイルで編集します。コードツールバーにアクセスできないCtrl + kを押すこともできません – Superdawg

答えて

1

forループにdb.close();を入れないでください。あなたのすべての挿入が完了したら、それを呼び出すだけです。

この注文が本当に重要な場合(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(); 
}); 

それとももちろん、私はあなたのためにそれをテストすることはできませんが、私はあなたのアイデアを得る願っています。

もう1つのオプションは、2つの非同期呼び出しを分離することです。 最初のループですべてのデータを取得し(一度に100個)、配列に格納してから、その配列をループしてデータをMongoに挿入します。

+0

実行された順序は?これにより、操作の順番も修正されますか?私はまだauthedclient(publicclient)操作を実行するコードをし、DBに挿入して100を追加します。ただし、コードはすべてのコマンドを一度に実行しています。 – Superdawg

+0

2つのループと2つの非同期呼び出しでは、混乱するのが普通です。それをよりきれいにする方法を考えてみましょう。 – Skwal

+0

ありがとうございます。ありがとうございました。 – Superdawg

関連する問題