0

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

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

在我的回调函数中,我只需要 return drupal_json('hello'); 但直到第二次才出现。例如,如果我点击按钮,什么都不会发生,但如果我再次点击它,它会提示“你好”。在有动态数据的情况下,也会一键延迟。例如,假设第一次点击应该提示 1,第二次点击应该提示 2,以此类推。相反,第一次点击什么都不做,第二次点击会提示 1,第三次点击会提示 2,等等。任何想法为什么会发生这种情况?谢谢。

4

2 回答 2

0

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

$.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:回调,以防万一失败(否则您的回调可能永远不会被调用,因为没有成功)。

于 2010-01-19T01:12:02.333 回答
0

这可能是因为 AJAX 请求不会阻止脚本。它继续发出请求,但在执行下一行(您的警报)之前不等待结果返回。因此,它第一次触发警报时没有获取任何数据,第二次它只有来自第一个请求的数据(第二个请求已经开始,但尚未完成),依此类推。

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

$.ajax({
  type: 'POST',
  url: 'test/get/1',
  success: function (result) { alert(result); },
  dataType: 'json',
  data: 'js=1'
 });
于 2010-01-19T01:12:26.797 回答