現在、NodeJSの使用方法を学習しており、この比較的単純な関数を一定の間隔で実行するよう書いています。この機能の目的は、新しく作成されたドロップレットを取得し、IPアドレスを更新することです。NodeJS配列の予期しない動作
router.newDroplets = setInterval(function() {
Server.find().then(function(svrs) {
for (var i = 0; i < svrs.length; i++) {
if (svrs[i].status == "Creating") {
library.getDropletById(svrs[i].serverid).then(function(svr) {
if (svr.droplet) {
for (var j = 0; j < svr.droplet.networks.v4.length; j++) {
if(svr.droplet.networks.v4[j].type == 'public') {
var ip_address = svr.droplet.networks.v4[j].ip_address;
console.log(ip_address);
Server.update({serverid: svr.droplet.id}, {ipaddress: ip_address, status: "Online"}, function(error, n) {
if (error) console.log(error);
else console.log(n);
});
}
}
} else if (svr.id) {
// NOTE THIS LINE
console.log(svrs);
}
}, function() {
});
}
}
}, function() {
});
}, 2500);
特有の振る舞いは、上に記された行です。
console.log(svrs)
を使用すると、MongoDBのサーバーコレクションにJSONドキュメントの配列が取得されます。しかし、console.log(svrs[i])
を使用すると、undefined
がコンソールに記録されます。これは、私がvar i = 0;
をforループの外に宣言しても起こります。なぜこのようなことが起こり、どうすればsvrs[i]
にアクセスできますか?
ような何かを試すことができ
Array.prototype.forEach
を使用するようにコードを変換することができ、私= 0; forループの外側で、 'for'ループは? –
約束を正しく使用し、そのようなスパゲティコード(ネストされた約束)を書いてはいけません。 – undefined
あなたは 'i'を記録しようとしましたか? –