2017-07-19 6 views
0

タイトルに申し訳ありませんが、私は具体的にしようとしていましたが、ちょっと混乱します。実際にコードの一部は、私の問題が何であるかをお見せするためのより良い方法をする必要があります:setIntervalをループするときに古いデータを保持せずに配列にファイルをプッシュする方法はありますか?

var i = 0 
var jsonArray = [] 
var startTime = new Date().getTime() 

var writeFile = setInterval(function() { 
    var currentTime = new Date().getTime() 
    var stopTime = 31 * 1000 
    var executeScript = setInterval(function() { 
     // the script will stop after some time 
     if (currentTime - startTime > stopTime) { // time in ms: 60 * 60 * 1000 = 1 hour 
      process.exit() 
     } 
     // making request and fetching data 
     http.get(request, function (response) { 
      response.pipe(bl(function (err, data) { 
       if (err) return console.error(err) 
       response.setEncoding('utf8') 
       parseString(data, function (err, result) { 
        result = result.SoccerFeed.SoccerDocument[0].MatchData[0].TeamData 
        // creating object and filling it with received data 
        result = createJsObject(result) 
        // converting object in json format 
        var jsonObject = JSON.stringify(result, null, 4) 
        jsonArray.push(jsonObject) 
        // copying json into a new file without overwriting previous written data 
       }) 
      })) 
     }).on('error', console.error) 
    }, 1 * 1000) // interval in ms: 90 * 1000 = 90 seconds/1 min 30 
    fs.writeFile('API - Opta - ' + moment().format('YYYY - DD.MM (HH:mm:ss)') + '.txt', jsonArray, function(err) { 
     if (err) throw err 
    }) 
    jsonArray = [] 
    i++ 
}, 10 * 1000) 

問題は、私は、ファイルに押してるのアレイは、私が掃除しても、古いものからデータを保持していることですそれはjsonArray = []である。私は何か間違っていることを知っているが、私は何が分からない。それは役立ちますが、この行にこの

var writeFile = setInterval(function() { 

var jsonArray = [] 

を配置し、あなたがjsonArrayをクリアする必要はありません場合は、あなたの助けを事前に

おかげ

+0

前回保存したファイルのデータを含まない配列でx分ごとに新しいファイルを作成したいだけです。このコードでは、ファイルはx分ごとに配列を保存しますが、すべての次のファイルは古い配列/オブジェクトのデータを保持します – Psychologist

答えて

0

なり、最初に私はそれがfs.writeFileがjsonArrayの空白のコピーを取得して、非同期の問題だと思いました。これは、javascriptがjsonArray = []を処理する方法に起因するものではありません。 fs.writeFileを呼び出すと、 "reference"によって渡されたjsonArrayを渡します。 jsonArray = []に設定すると、実際には新しいオブジェクト全体が作成されます。 fs.writeFileに渡されたオブジェクトは、もはやjsonArrayによって参照されなくなり、スコープはfs.writeFileの呼び出しにのみ含まれているため、渡された状態が維持されます。代わりにjsonArray.length = 0を呼び出した場合、実際の配列fs.writeFileを上書きするため、常に空の配列をファイルに出力します。この投稿をチェックしてください:How do I empty an array in JavaScript?

要するに、これは問題ではありません。

しかし実際の問題は、http.getがファイルの書き込み後に何度もデータを受信して​​いることです。これらのことはあなたの次のループまで書き込まれません。物事は常に後ろにあるあなたの記述された順序は完璧な意味を成しています。

  1. チェックはそれが
  2. スタートhttp.get
    • はいつか将来的に応答が受信され、に追加の時間をやめるいないことを確認する:

      あなたのシーケンスは、これはあなたの間隔の内部executeScriptですjsonArray

  3. 開始fs。WriteFile関数は、jsonArrayの内容がファイルに書き込まれるために何が起こっているかのように時間にこの時点でロックされ ファイルが書き込まれているいつか将来的に
  4. 設定jsonArray = []
今、あなたは2つの間隔がで起こっている

var i = 0 
var jsonArray = [] 
var startTime = new Date().getTime() 

var writeFile = setInterval(function() { 
    fs.writeFile('API - Opta - ' + moment().format('YYYY - DD.MM (HH:mm:ss)') + '.txt', jsonArray, function(err) { 
     if (err) throw err 
    }) 
    jsonArray = [] 
    i++ 
}, 10 * 1000) 

var executeScript = setInterval(function() { 
    var currentTime = new Date().getTime() 
    var stopTime = 31 * 1000 

    // the script will stop after some time 
    if (currentTime - startTime > stopTime) { // time in ms: 60 * 60 * 1000 = 1 hour 
     process.exit() 
    } 
    // making request and fetching data 
    http.get(request, function (response) { 
     response.pipe(bl(function (err, data) { 
      if (err) return console.error(err) 
      response.setEncoding('utf8') 
      parseString(data, function (err, result) { 
       result = result.SoccerFeed.SoccerDocument[0].MatchData[0].TeamData 
       // creating object and filling it with received data 
       result = createJsObject(result) 
       // converting object in json format 
       var jsonObject = JSON.stringify(result, null, 4) 
       jsonArray.push(jsonObject) 
       // copying json into a new file without overwriting previous written data 
      }) 
     })) 
    }).on('error', console.error) 
}, 1 * 1000) // interval in ms: 90 * 1000 = 90 seconds/1 min 30 

私はあなたがそうのように入れ子にされていない2つの別々の間隔を持って提案します同じ時間。スクリプトを実行する際の1秒のループには、ファイルを書き込む際の10秒のループが始まるときに、多くのデータがキューに入れられています。ファイルを書き込んだ後、直ちにjsonArrayをクリアして、executeScript間隔の1秒後に追加を続けます。

+0

あなたのクイックアンサー。私は現時点で#3を試しただけですが、動作しませんでした。 JSON.parse(JSON.stringify(jsonArray))でjsonArrayを置き換えただけですが、私が書いたコードはすべて保存しました。私は間違いを犯しましたか?編集:fs.writeFileSyncでさえ動作しません... :( – Psychologist

+0

あなたがやっていることで何かを逃しました。私の答えを更新します。これはあなたのために働くでしょう。 – Brian

+0

ブライアンさんありがとうございました! – Psychologist

0

はわかりません。

ので、それはそう

var writeFile = setInterval(function() { 
    var jsonArray = [] 
    // ... 
+0

ねえ、あなたの答えに感謝します。私はすでに試してみましたが、うまくいかず、すべての配列が空になりました。ところで、私のコードには別の問題があります。ファイルの最初のコピーは常に空ですが、私はなぜそれを防ぐのか分かりません。 – Psychologist

+0

これはちょっと前提ですが、デバッグをしなくても手伝ってもらえませんでしたが、httpリクエストでリクエストごとに同じデータが返される可能性があるので、新しいファイルが同じデータを持っている理由です。 –

関連する問題