我必须创建一个从摄像头请求数据的页面,然后使用该信息。我的主要问题是在错误和成功函数中,我无法访问有关索引的外部信息。
我目前的代码是这样的:
function getCameraParameter(paramList, x_callback) {
var paramResults = {};
var errorResults = {};
var index = 0;
for (index = 0; index < paramList.length; index++)
{
(function(innerIndex) {
$.ajax({
url: "/params.cgi?getParameter&" + paramList[innerIndex],
type: 'GET',
dataType: 'text',
cache: false,
async: true,
timeout: 30000,
success: function(x_data) {
var value;
var el = paramList[innerIndex];
value = new RegExp(el + '=([^\n]+)').exec(x_data) || [];
if (value.length > 1)
paramResults[el] = value[1];
if (paramResults.length + errorResults.length === paramList.length)
{
x_callback(paramResults, errorResults.length > 0);
}
},
error: function(e) {
errorResults[paramList[innerIndex]] = "";
if (paramResults.length + errorResults.length === paramList.length)
{
x_callback(paramResults, true);
}
}
});
})(index);
}
}
function cameraTest()
{
getCameraParameter(["Resolution", "CameraIP", "CameraSerialNumber"], printParameters);
}
function printParameters(paramValues, is_error)
{
if (is_error)
console.log("Error occurred\n");
for (var key in paramValues)
{
if (paramValues.hasOwnProperty(key))
console.log(key + "->" + paramValues[key] + "\n");
}
}
在Ajax请求中,innerIndex是undefined
,到目前为止我没有找到解决办法。 paramResults
和errorResults
也是未知的,这很痛苦,我真的不想让它们成为全局对象。我该如何解决这个问题?
编辑:请注意我得到了有效的结果,比如CameraResolution = 1920x1080,所以这部分可以工作,但我需要以某种方式访问Ajax调用的循环索引。
答案 0 :(得分:1)
innerIndex
在成功/错误回调中可用,因为JavaScript中的每个变量在每个内部范围内都可见。
您的代码存在的问题是,您尝试访问{}
的长度并且对象没有长度。
我重构了你的代码以使用完整的回调,无论请求是否成功,都会被调用。
function getCameraParameter(paramList, x_callback) {
var paramResults = {};
var errorResults = {};
var index = 0;
var completed = 0;
for (index = 0; index < paramList.length; index++)
{
(function(innerIndex) {
$.ajax({
url: "/params.cgi?getParameter&" + paramList[innerIndex],
type: 'GET',
dataType: 'text',
cache: false,
async: true,
timeout: 30000,
success: function(x_data) {
var value;
var el = paramList[innerIndex];
value = new RegExp(el + '=([^\n]+)').exec(x_data) || [];
if (value.length > 1)
paramResults[el] = value[1];
},
error: function(e) {
errorResults[paramList[innerIndex]] = e;
},
complete: function () {
completed++;
if (completed === paramList.length) {
x_callback(errorResults, paramResults);
}
}
});
})(index);
}
}
function cameraTest()
{
getCameraParameter(["Resolution", "CameraIP", "CameraSerialNumber"], printParameters);
}
function printParameters(errorResults, paramValues)
{
if (Object.keys(errorResults).length > 0) {
console.log("Error occurred\n", errorResults);
}
for (var key in paramValues)
{
if (paramValues.hasOwnProperty(key))
console.log(key + "->" + paramValues[key] + "\n");
}
}