2012-12-10 76 views
4

我试图填充全局变量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

+0

是的,我使用的是对象'{}'来模拟它。 –

+0

默认情况下,Ajax是异步的,您的$ .get不会在函数返回空的'the_selected_dates'对象之前完成。 –

回答

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); 
});​ 
+0

优秀的答案!感谢你们所有人...... –

+0

推迟使用:) +1 –

4

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

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

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


您可以使用$.ajaxSetup()全局更改所有$.ajax电话的行为。但是,我不会推荐它将async设置为false

+0

这是真的,但更好的答案将解释这意味着什么 –

+0

@JuanMendes或可能的链接到数百个问题之一有同样的问题 –

+0

@alexander,JuanMendes,KevinB,容易的人。我必须在接受一个答案之前进行测试。我给了所有人一个赞成票,因为所有都指向“同步性”方面......微笑:) –

2

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

2

当您设置async: false时,您的成功处理程序将在主函数返回之前先运行;这就是它工作的原因。但是,这是不建议,因为它在执行呼叫时挂起浏览器。

您应该以异步的方式执行此操作,方法是将回调函数传递到您的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 
});