日志仅显示四行数据之一

时间:2016-10-15 11:48:28

标签: javascript node.js

我正在编写一个用于自动车辆定位系统的小型Node js应用程序。 这是我遇到麻烦的代码。

markerData包含4行,但只有在日志中我才能看到最后一行。

for (var i = 0, len = markerData.length; i < len; i++) {
        var thisMarker = markerData[i];

            sql.connect(config, function (err) {
                var request = new sql.Request();                    
                request.input('myval', sql.Int, thisMarker.id);                    
                request.query('SELECT d.id, d.name,  d.lastupdate, p.latitude, p.longitude, p.speed, p.course FROM  dbo.devices AS d INNER JOIN  dbo.positions AS p ON d.positionid = p.id AND d.id = p.deviceid  WHERE        (d.id = @myval)', function (err, recordset2) {



                    if (typeof recordset2 != 'undefined') {                      

                        thisMarker.position.lat = recordset2[0].latitude;
                        thisMarker.position.long = recordset2[0].longitude;

                        console.log(recordset2[0].id);
                    }                                                                       


                });

            });

        }

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

因为var在范围方面不是块级变量,所以`sql&#39;模块需要时间异步连接到数据库,同步循环可能会更改变量的值,这是因为变量在成功连接时保存对最后一个对象的引用,因此打印最后一行的原因。 / p>

我建议将_.each模块与async一起使用而不是async.each,因为你几乎没有异步操作来摆脱同步循环。

您可以在这里查看样品,

http://justinklemm.com/node-js-async-tutorial/

以下是您使用async.each

的更新代码

- &GT;使用async

安装npm install async --save模块

- &GT;然后在所需位置添加以下参考,

// Reference
var async = require('async');

- &GT;修改后的代码:

&#13;
&#13;
sql.connect(config, function (err) {
   if(err) {
      console.log('Connection error: ');
      console.log(err);
   } else {
     
        async.each(markerData, function(thisMarker, callback) {
             var request = new sql.Request();                    
                    request.input('myval', sql.Int, thisMarker.id);                    
                    request.query('SELECT d.id, d.name,  d.lastupdate, p.latitude, p.longitude, p.speed, p.course FROM  dbo.devices AS d INNER JOIN  dbo.positions AS p ON d.positionid = p.id AND d.id = p.deviceid  WHERE        (d.id = @myval)', function (err, recordset2) {
               if(err) {
                 console.log(err);
                 callback();
              } else {
                        if (typeof recordset2 != 'undefined') {                      
    
                            thisMarker.position.lat = recordset2[0].latitude;
                            thisMarker.position.long = recordset2[0].longitude;
    
                            console.log(recordset2[0].id);
                        } else {
                            console.log('Recordset empty for id: ' + thisMarker.id);
                        }                                                                     
    
                        callback();
                }
            });
          
        }, function(err){
             if(err) {
               console.log(err);
             }
        });
     
   }
  
});
&#13;
&#13;
&#13;

答案 1 :(得分:0)

我不完全确定你的图书馆是如何运作的,但大概是apply plugin: "com.android.application" import com.android.build.OutputFile // ... // ADD THE LINES BELOW project.ext.react = [ // the entry file for bundle generation entryFile: "src/index.android.js", ] // ADD THE LINES ABOVE // ... apply from: "../../node_modules/react-native/react.gradle" 是一系列记录。因此recordset2是第一张唱片。如果你想要下一个,你应该尝试recordset2[0],依此类推。

阵列:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

您可能需要在某个时刻遍历数组中的所有元素。使用for loop表示:

recordset2[1]

这将打印出您的查询返回的所有内容。