Javascript NodeJS数组的意外行为

Javascript NodeJS数组的意外行为,javascript,arrays,node.js,mongodb,mongoose,Javascript,Arrays,Node.js,Mongodb,Mongoose,我目前正在学习如何使用NodeJS,并编写了这个相对简单的函数以固定的时间间隔运行。此功能的目的是检索新创建的液滴并更新其IP地址 router.newDroplets = setInterval(function() { Server.find().then(function(svrs) { for (var i = 0; i < svrs.length; i++) { if (svrs[i].status == "Creating")

我目前正在学习如何使用NodeJS,并编写了这个相对简单的函数以固定的时间间隔运行。此功能的目的是检索新创建的液滴并更新其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);
router.newdrops=setInterval(函数(){
Server.find().then(函数(svrs){
对于(变量i=0;i
这种特殊的行为与上面标记的线条有关


当我使用
console.log(svrs)
时,我在MongoDB的服务器集合中获得了一个JSON文档数组。但是,当我使用
console.log(svrs[I])
时,
undefined
会记录在控制台中。即使我声明
var I=0,也会发生这种情况在for循环之外。为什么会发生这种情况?我如何访问svrs[I]

承诺的工作方式是承诺链异步运行。在代码运行时,
i
等于
svrs.length
,因此
svrs[i]
将是
未定义的。这是因为for循环在调用任何
然后
回调之前全部执行。您可以将代码转换为使用

所以你可以试试

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]);
      }
     });
   }
});

承诺的工作方式是承诺链异步运行。在代码运行时,
i
等于
svrs.length
,因此
svrs[i]
将是
未定义的。这是因为for循环在调用任何
然后
回调之前全部执行。您可以将代码转换为使用

所以你可以试试

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]);
      }
     });
   }
});

即使我声明var I=0,也会发生这种情况;在for循环之外,哪个
for
循环?正确使用承诺并避免编写这样的意大利面代码(嵌套承诺)。您是否尝试记录
i
?@AlexeyTen我尝试记录i,我收到了5个,这是我服务器集合中的文档数。我通常使用蓝鸟库。它有相当好的文档,可以是相关的。请检查
即使我声明var I=0,也会发生这种情况;在for循环之外,哪个
for
循环?正确使用承诺并避免编写这样的意大利面代码(嵌套承诺)。您是否尝试记录
i
?@AlexeyTen我尝试记录i,我收到了5个,这是我服务器集合中的文档数。我通常使用蓝鸟库。它有相当好的文档,可以是相关的。请检查,非常感谢您的解释和建议。我从来不知道
then
回调只有在
for
循环完成循环后才会调用。非常感谢您的解释和建议。我从来不知道
then
回调只有在
for
循环完成后才被调用。