【问题标题】:Ajax synchronous callbacksAjax 同步回调
【发布时间】:2009-03-10 18:14:35
【问题描述】:

我在本地文件夹中有一个 pageTest.html,这个页面调用一个 service.ashx?i=...(返回值参数通过递增 +1)并遵循 Ajax 代码:

.
.
getIncr: function(parameters, success){
       $.ajax({
               async: false, 
               type: methodType,
               url: getTarget,
               data: "n="+parameters,
               dataType:"jsonp",
               success: success
             });
    }
.
.

html页面调用这个函数m次(带脚本..):

  .    
  var start = function(){
  .
  .
  var val = 0;
  .      
  .
  for(i=0; i<m; i++)
  {
      Foo.getIncr(val, function(returned_n){
          val = returned_n;
      });

  }

};

在页面加载期间,调用以“异步模式”执行,但我在 Ajax 中设置了“async: false”。我阅读了这个问题并找到了原因,即如果在不同的域中,Ajax 无法同步从 page.html 到 service.ashx 的调用。 是否有在 page.html 中对 service.ashx(在不同域中)执行同步调用的解决方案?

【问题讨论】:

  • 苛刻,英语显然不是 Domenico 的第一语言。我理解得很好。
  • 我会用任何第二语言帮助解决这个问题...谢谢 Domenico!

标签: javascript jquery ajax callback synchronous


【解决方案1】:

嗯,问题是您无法发出同步 JSONP 请求。正如安迪指出的那样,它的实现方式是通过所谓的“脚本标签破解”。 jQuery 无法在等待填充脚本标记时停止 javascript 应用程序的执行。

所以你调用了 jQuery 的正确方法来发出 JSONP 请求,但是因为它是 JSONP,所以没有应用异步选项并且没有办法绕过它。您必须异步处理请求。

顺便说一句,在同步模式下使用 $.ajax 并不是一个好主意。如果请求需要太多时间才能完成,浏览器将停止,您的用户可能会收到一个弹出窗口,提示页面没有响应。

【讨论】:

    【解决方案2】:

    你根本不能使用 XMLHttpRequest 跨域。不管是同步还是异步。

    由于您似乎使用的是 JSON(和 jsonp),因此您应该能够通过脚本标签 hack 实现您想要的。我相信 jQuery 内置了这个功能(顺便说一句,您使用的是 jQuery 吗?):

    http://docs.jquery.com/Release:jQuery_1.2/Ajax#Cross-Domain_getJSON_.28using_JSONP.29

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多