2010-01-19 39 views
0

我有一个简单的点击功能,下面的代码,但我似乎无法获得第一次点击的数据。Drupal Ajax数据检索延迟

$.ajax({ 
    type: 'POST', 
    url: 'test/get/1', 
    success: function (result) { testit = result; }, 
    dataType: 'json', 
    data: 'js=1' 
}); 
alert(testit); 

在我的回调函数中,我只是返回drupal_json('hello');但直到第二次才显示出来。例如,如果我点击按钮,什么都不会发生,但是如果我再次点击它,它会提醒'你好'。在有动态数据的情况下,它也会被延迟一次点击。例如,假设第一次点击应该提醒1,第二次应该提醒2,等等。相反,第一次点击什么也不做,第二次点击会提醒1,第三次点击会提醒2,等等。任何想法为什么会发生?谢谢。

回答

0

a in ajax代表异步。因此,testit不会被设置为阿贾克斯的反应的结果,直到success:函数被调用(当Ajax调用成功完成)

$.ajax({ 
    type: 'POST', 
    url: 'test/get/1', 
    success: function (result) { testit = result; alert(testit); }, 
    dataType: 'json', 
    data: 'js=1' 
}); 

,如果你想它同步工作,还可以设置aysnc:false在jQuery的.ajax选项,就像这样:

var testit = $.ajax({ 
    type: 'POST', 
    async: false, 
    url: 'test/get/1', 
    dataType: 'json', 
    data: 'js=1' 
}).responseText; 

alert(testit); 
在第二种方法

,所有的JavaScript将推迟至Ajax调用完成后(通常明显慢)。我建议你在第一个例子的success:回调中做你的代码。但是,您也可能想要创建一个error:回调函数,以防万一发生错误(否则您的回调函数可能永远不会被调用,因为没有成功)。

+0

谢谢,学到新的东西。 – Wade 2010-01-19 01:20:51

0

这可能是因为AJAX请求不会阻止脚本。它继续前进并发出请求,但不会等待结果返回,然后再执行下一行(警报)。因此,它第一次触发警报时,没有数据被提取,第二次只有第一个请求的数据(第二个请求已经启动,但没有完成),依此类推。

解决的办法是把警报在回调函数,它没有得到,直到已接收到响应后执行:

$.ajax({ 
    type: 'POST', 
    url: 'test/get/1', 
    success: function (result) { alert(result); }, 
    dataType: 'json', 
    data: 'js=1' 
}); 
+0

感谢您的替代解决方案。我确实需要稍后使用这个变量,所以我将使用异步解决方案。 – Wade 2010-01-19 01:21:46