我正在编写一个用于自动车辆定位系统的小型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);
}
});
});
}
请帮我解决这个问题。
答案 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;修改后的代码:
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;
答案 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]
这将打印出您的查询返回的所有内容。