DrupalAjax数据检索延迟

DrupalAjax数据检索延迟,ajax,drupal,data-retrieval,delay,Ajax,Drupal,Data Retrieval,Delay,我有一个简单的点击功能,代码如下,但我似乎无法在第一次点击时获得数据 $.ajax({ type: 'POST', url: 'test/get/1', success: function (result) { testit = result; }, dataType: 'json', data: 'js=1' }); alert(testit); 在我的回调函数中,我只返回drupal_json('hello');但直到第二次才出现。例如,如果我单击该按钮,将不会发

我有一个简单的点击功能,代码如下,但我似乎无法在第一次点击时获得数据

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

在我的回调函数中,我只返回drupal_json('hello');但直到第二次才出现。例如,如果我单击该按钮,将不会发生任何事情,但如果我再次单击它,它将发出“hello”警报。在有动态数据的情况下,它也会延迟一次单击。例如,假设第一次单击时应向1发出警报,第二次单击时应向2发出警报,依此类推。相反,第一次单击将不起任何作用,第二次单击将向1发出警报,第三次单击将向2发出警报,等等。你知道为什么会发生这种情况吗?谢谢。

ajax中的
a
代表异步。因此,
testit
将不会设置为ajax响应的结果,直到调用
success:
函数(当ajax调用成功完成时)

如果希望它同步工作,还可以在jQuery的
.ajax
选项中设置
aysnc:false
,如下所示:

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

alert(testit);

在第二种方法中,所有javascript都将被延迟,直到ajax调用完成(通常非常慢)。我建议只在第一个示例的
success:
回调中执行代码。但是,您可能还需要创建一个
错误:
回调,以防出现故障(否则您的回调可能永远不会被调用,因为没有成功)。

这可能是因为AJAX请求没有阻止脚本。它会继续执行并发出请求,但不会等到结果返回后再执行下一行(您的警报)。因此,当它第一次点击警报时,没有提取任何数据,第二次它只有来自第一个请求的数据(第二个请求已启动,但尚未完成),依此类推

解决方案是将警报放入回调函数中,直到收到响应后才会执行该函数:

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

谢谢你的替代解决方案。不过,我以后确实需要使用该变量,因此我将使用异步解决方案。
$.ajax({
  type: 'POST',
  url: 'test/get/1',
  success: function (result) { alert(result); },
  dataType: 'json',
  data: 'js=1'
 });