2017-01-10 3 views
0

私は配列にデータを保存しようとしていますが、console.logを使用して配列が空であると思われ、そのデータを表示できないとわかりません。私の現在のコードが正しく構成されているかどうかを確認してください:ループを介して.push()を使用した後、配列が空白として表示されますか?

を私はmatchIdsを確認したいと思い、実際にデータの配列が含まれています

var getGameData = function (matchIds) { 
console.log('Executing getGameData'); 
return new Promise(function (resolve, reject) { 
    var gameData = []; 
    for (var i = 0; i < matchIds.length; i++) { 
     lolapi.Match.get(matchIds[i], function (error, gamedata) { 
      if (error) { 
       return reject(error); 
      } 
      if (gamedata) { 
       gameData.push(gamedata); 
      } 
     }); 
     if (i === 9) { 
     resolve(gameData); 
     } 
    } 
}); 
}; 
+0

あなたはどこにログインしていますか?解決後私は推測する? – Erik

+0

[非同期呼び出しから応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – str

答えて

0

あなたのproimse体内の非同期コードの別の部分を持っている(まあ、私はそれを想定して非同期)あなたの結果に基づいています。

lolapi.Match.get(matchIds[i], function (error, gamedata) { ... 

したがってループ(用)の終わりに、複数のコールバックからのごgameData.push(gamedata);命令は()[]となりますので、resolve(gameData);をexectuedされていません。

あなたはPromise.allのアプローチを使用することができます。

var gameDataPromises = []; 
for (var i = 0; i < matchIds.length; i++) { 
    gameDataPromises.push(new Promise(function(res, rej) { lolapi.Match.get(matchIds[i], function (error, gamedata) { 
     if (error) { 
      rej(error); 
     } 
     if (gamedata) { 
      res(gamedata); 
     } 
    })})); 
} 

Promise.all(gameDataPromises).then(resolve).catch(reject) 

これは効果的にそれらのすべてを待って、単一の約束にすべてのlolapi.Match.getをキャプチャします - 1はあなたの主な約束の拒否を失敗した場合に呼び出されます - すべて成功した場合、内部コールのすべてのデータは、あなたの主な約束の解決に配列として渡されます(私が推測していたもの)。

+0

おかげで私はもっと約束を理解しなければならないと思う。私はいつもコールバックを使ってそれをやったhaha – Elevant

関連する問題