4

我试图填充全局 varselectedDates认为是第一个函数,但是当我尝试获取一些值时它失败了,例如,selectedDates['1/23/2013']

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

如果它们都填充the_selected_dates返回给 set的外部 var,那么区别在哪里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);

调试数据

在此处输入图像描述

在此处输入图像描述

使用$.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);

调试数据

在此处输入图像描述 在此处输入图像描述

4

4 回答 4

4

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

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

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


您可以使用$.ajaxSetup()全局更改所有$.ajax调用的行为。但是,我不建议将其设置asyncfalse.

于 2012-12-10T18:05:23.897 回答
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
});
于 2012-12-10T18:10:09.600 回答
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);
});​
于 2012-12-10T18:16:19.350 回答
2

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

于 2012-12-10T18:07:44.500 回答