nodejs(6.9.1)で実行されているセイル(0.11.0)を使用しています。私はforループを通してそれを満たすことによって配列を構築しようとしています。私はこの完成したアレイをクライアントに応答して送るだろう。ここでは、スタックオーバーフローの人々によって示唆されているように私はforループを使ってnodejsの配列を構築する
for (var i = yearStart; i < yearEnd+1; i++) {
arr.push(i);
}
を提案し、たとえば、様々な方法を試してみましたが、使用することが提案されています
var array = calendars.map(function(item) {
return item.id;
});
console.log(array);
同様に、私は多くのメソッドを試しましたが、同じ問題を抱えていますが、ループ中に配列がいっぱいになりますが、ループが完了するとすぐに、配列は非同期処理で空になります。したがって、スポンサー。私はループ本体内のインデックスをチェックしてみました、これに取り組むと
var userArray = [];
_.each(users, function(user, index){
MySQLConnector.query('CALL user_image (?)', [user.id], function(err, userImage){
if(err){
return res.json({"status":"some_error"});
}else{
userID = user.id
userImageID = userImage[0][0].id;
var userInfo = {
userID: userID,
userImageID: userImageID
}
userArray.push(userInfo)
if(index == users.length - 1){
res.json({selectedUsers: userArray});
}
}
});
});
をループ本体自体の内部からの応答を送信するには、私は空userArrayを開始し、その後ユーザーオブジェクトの各要素のを反復処理していますオブジェクトは、名前ユーザおよびインデックスによって特徴付けられる。 MySQLのクエリを通じて、私はuserImageオブジェクトを取得していますし、各反復では、私がユーザーIDとuserImageIDで構成されていのUserInfoと呼ばれるオブジェクトを作成しています。私はuserArrayにこのオブジェクトをプッシュしています。そして、forループ(_.each
)の繰り返しのたびに、最後のインデックスに達したかどうかをチェックします。最後のインデックスに達すると、ループ本体が完了する前に、最終配列が応答として送信されます。
ここでも私は配列本体が必ずしも完全に埋められないという問題があります。理由は、非同期プロセスによるものです。インデックスは必ずしも0,1,2,3,4、...の順番に従うとは限らず、任意の数で開始することができ、次の繰り返しで任意のインデックスにジャンプすることができます。たとえば、開始する最初のインデックスは4、2番目のインデックスは0、3番目のインデックスは2となります。このシーケンスは、ループのためにこれを実行するたびに異なります。ユーザーにとっては、ランダムなプロセスのように見えます。従ってusers.lengthは8であり、現在のインデックスをランダムに7第3の反復であり、条件index == users.length - 1
が満たされると、誰かが示唆でき応答が3つの要素ではなく8
からなるアレイとだけ送信される場合私は、nodejsのforループを通して配列を塗りつぶし、その配列を応答として送信することにより、すべての項目が元の順序で配列に含まれるようにする、より強固な方法ですか?
それは命令に従わないだろうと私はあなたもマップと同じ問題を抱えていると思う。ロダッシュとブルーバードの減量を見てください。後者では、注文を保証します。私はそれが同じであろうが、それについて間違っているかもしれないと思います。 –
もう少し考えてみると、非同期ライブラリでは、私はしばしばeachSeriesを使用します。これは順序を保証し、既存のコードの解決策になるでしょう。 –