2017-09-22 9 views
1

私は数ヶ月前にこの質問について少し質問しましたが、最近私はそのスクリプトに戻りました。私は何かを考え出し、友人がスクリプトを手助けしましたが、今は別の問題があります。Nodejs async.eachSeries

これが今の私のスクリプトです:

var j = schedule.scheduleJob('*/5 * * * * *', function(){ 
    var steamids = []; 

    con.query("SELECT * FROM counterStrikeGlobalOffensive", function (err, rows) { 
     for (var i = 0; i < rows.length; i++) { 
      steamids.push(rows[i].steam64ID); 
     } 

     //const steamIDs = ["2342342341234123", "23423412341234", "2342314123423"]; // Steam IDs to check 
     eachSeries(steamids, (steamID, callback) => { 
      CSGOCli.playerProfileRequest(CSGOCli.ToAccountID(steamID));  
      CSGOCli.on("playerProfile", function(profile) { 
         console.log(JSON.stringify(profile, null, 2)); 
         callback(); 
      }); 
     }, (err) => { 
      // error thrown = set, else we're done 
     }); 
    }); 
}); 

私は一定のsteamIDsを使用する場合、それは完璧に動作しますが、私はsteamidsを使用する場合、それは私にエラーを与えます(私が説明します)...

私がしたら、console.log(steamids); 「それが機能しない理由であってはならない数字の周りに多分」持っているので、そのほぼ一定SteamIDsと同じですが、一定それはこの

[ '76561198152643711', '76561198213530057' ] 

私を返し、steamIDsは

const steamIDs = ["2342342341234123", "23423412341234", "2342314123423"]; 

です私が間違っている?

また、私はコールバック()を持っていますが、どうすればエラーになるのをやめさせることができますか? エラー:コールバックが既に呼び出されていました。

CSGOCli.on()が複数回実行されるため、あなたはError: Callback was already called.を得る

+0

私の提案は、離れて非同期モジュールから移動し、 '非同期Await' –

+0

いやでネイティブまたはブルーバード' Promises'を使用するようになりますそれは2日目のようにノードjを使用してからはあまりにも複雑です。 –

答えて

0

:)をしてくださいその他の情報については確認して下さい。コールバックを一度呼び出すと、イベントが再び発生します。コールバックは再び呼び出されますが、一度だけ呼び出される必要があります。簡単な再現のために

この例を参照してください。

async.eachSeries([1, 2, 3], (data, callback) => { 
    console.log("Data:", data); 
    for(let i = 0; i < 2; i++) { 
    callback(); 
    } 
}, 
(err) => { 
    console.log("Callback: ", err); 
}); 

しかし、あなたは、このようなコールバックの前にリターンを追加する場合:return callback();、関数が返されますので、問題が消えて、何のコールバックが再び呼び出されません。

だからあなたのコードは、これに変更し、それが動作するかどうかを確認:

CSGOCli.on("playerProfile", function(profile) { 
      console.log(JSON.stringify(profile, null, 2)); 
      return callback(); 
}); 
+0

だから私はあなたが言ったことは、それは動作しますが、私はまだ取得する /root/node_modules/async/dist/async.js:903 (fn === null)が新しいエラー( "コールバックはすでに呼び出されました。 ); エラー:コールバックが既に呼び出されていました。 –

+0

また、コマンドの前にリターンを追加しようとすると、 'return CSGOCli.on(" playerProfile "、...' – David