3

我在本地文件夹中有一个 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 执行同步调用的解决方案(在不同的域中)?

4

2 回答 2

6

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

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

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

于 2009-03-15T23:13:29.280 回答
1

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

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

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

于 2009-03-10T18:44:10.750 回答