通过$ .ajax和$ .get / $。post填充关联数组的差异

时间:2012-12-10 18:01:55

标签: javascript jquery associative-array

我尝试填充全局变量selectedDates以及第一个函数,但是当我尝试获取某些值时失败,例如,selectedDates['1/23/2013']

尝试使用$ .ajax而不是$ .get后,我可以获得selectedDates['1/23/2013']之类的值。

如果它们都填充了返回到设置the_selected_dates的外部变量selectedDates,那么区别在哪里?

var selectedDates = {};
使用$.get

功能失败:

function getSelectedDates_fails(lead_id, month) {
    var the_selected_dates = {};
    $.get(
            window.location.href,
            {
                gf_lm_ajax : 1,
                get : 'lead_reminder_get_dates',
                lead_id : lead_id,
                month : month,
                nonce_gf_lm_ajax : gf_lmJsVars.nonce_gf_lm_ajax

            },
    function(output) {
        $.each(output.reminders, function(n, val) {
            the_selected_dates[val.date] = val.date;
        });
    }, 'json');
    return the_selected_dates;
}
selectedDates = getSelectedDates_fails(35, 12); console.debug(selectedDates);

调试数据

enter image description here

enter image description here

使用$.ajax的功能有效:

function getSelectedDates_works(lead_id, month) {
    var the_selected_dates = {};
    $.ajax(
            {
                url : window.location.href,
                dataType : 'json',
                data : {
                    gf_lm_ajax : 1,
                    get : 'lead_reminder_get_dates',
                    lead_id : lead_id,
                    month : month,
                    nonce_gf_lm_ajax : gf_lmJsVars.nonce_gf_lm_ajax
                },
                async : false,
                success : function(output)
                {
                    $.each(output.reminders, function(n, val) {
                        the_selected_dates[val.date] = val.date;
                    });
                }
            });
    return the_selected_dates;
}
selectedDates = getSelectedDates_works(35, 12); console.debug(selectedDates);

调试数据

enter image description here enter image description here

4 个答案:

答案 0 :(得分:4)

当您同步运行$.ajax 时,$.get不是。

这就是为什么getSelectedDates_fails()返回的速度比从服务器获得响应的速度快,因此返回一个空对象{}

您在selectedDates中看到的是在请求完成之前对象的状态异步


您可以使用$.ajaxSetup()全局更改所有$.ajax个来电的行为。但是,我不建议将async设置为false

答案 1 :(得分:2)

aysnc: false中有$.ajax,这是您无法直接使用$.get打开的设置 - 您必须使用$.ajaxSetup。但是,它可能不是您想要做的事情,但如果ajax请求异步运行,则在ajax请求完成之前已达到return the_selected_dates;。相反,您必须在回调中进行调试。

答案 2 :(得分:2)

设置async: false时,成功处理程序将在main函数返回之前先运行;这就是为什么它有效。但是,这是不推荐,因为它在执行调用时会挂起您的浏览器。

您应该以异步方式执行此操作,方法是将回调函数传递到处理结果时调用的getSelectedDates_works()函数中。这样,浏览器就会在请求和响应之间“休息”。

function getSelectedDates_works(lead_id, month, cb) 
{
    $.ajax({
        // ...
        success: function(output) {
            var the_selected_dates = [];
            $.each(output.reminders, function(n, val) {
                 the_selected_dates[val.date] = val.date;
            });
            // perform callback
            cb(the_selected_dates);
        }
    });
}

getSelectedDates_works(123, 456, function(dates) {
    // do stuff with dates here
});

答案 3 :(得分:2)

您应该异步获取数据,并确保在您决定对返回的数据执行某些操作时完成ajax功能:

function getSelectedDates(lead_id, month) {
    return $.ajax({
        url: window.location.href,
        dataType: 'json',
        data: {
            gf_lm_ajax: 1,
            get: 'lead_reminder_get_dates',
            lead_id: lead_id,
            month: month,
            nonce_gf_lm_ajax: gf_lmJsVars.nonce_gf_lm_ajax
        }
    });
}

getSelectedDates(35, 12).done(function(output) {
    var the_selected_dates = {};
    $.each(output.reminders, function(n, val) {
        the_selected_dates[val.date] = val.date;
    });
    console.log(selectedDates);
});​