gpt4 book ai didi

javascript - NodeJS 数组的意外行为

转载 作者:行者123 更新时间:2023-12-02 14:26:09 25 4
gpt4 key购买 nike

我目前正在学习如何使用NodeJS,并编写了这个相对简单的函数以固定的时间间隔运行。此功能的目的是检索新创建的 Droplet 并更新其 IP 地址。

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 的 Server 集合中获得一组 JSON 文档。但是,当我使用 console.log(svrs[i]) 时,undefined 会记录在控制台中。即使我在 for 循环之外声明 var i = 0;,也会发生这种情况。为什么会发生这种情况以及如何访问 svrs[i]

最佳答案

Promise 的工作方式是 Promise 链异步运行。当代码运行时,i 等于 svrs.length,因此 svrs[i] 将是 undefined >。这是因为 for 循环在调用任何 then 回调之前完整执行。您可以将代码转换为使用 Array.prototype.forEach

所以你可以尝试类似的东西

svrs.forEach(function(svrInstance, i) {
if (svrInstance.status == "Creating") {
library.getDropletById(svrInstance.serverid).then(function(svr) {
if (svr.droplet) {
...
} else if (svr.id) {
console.log(svrs[i]);
}
});
}
});

关于javascript - NodeJS 数组的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38215667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com