来自循环访问变量的

时间:2018-01-25 15:04:37

标签: javascript ajax

我必须创建一个从摄像头请求数据的页面,然后使用该信息。我的主要问题是在错误和成功函数中,我无法访问有关索引的外部信息。

我目前的代码是这样的:

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,到目前为止我没有找到解决办法。 paramResultserrorResults也是未知的,这很痛苦,我真的不想让它们成为全局对象。我该如何解决这个问题?

编辑:请注意我得到了有效的结果,比如CameraResolution = 1920x1080,所以这部分可以工作,但我需要以某种方式访问​​Ajax调用的循环索引。

1 个答案:

答案 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");
    }
}