【问题标题】:Multiple chained jQuery AJAX POST webservice calls多个链接的 jQuery AJAX POST Web 服务调用
【发布时间】:2012-06-13 02:55:44
【问题描述】:

我正在使用 jQuery AJAX 调用 web 服务。这些调用必须被链接起来。基于https://stackoverflow.com/a/995648/296575的解决方案,我创建了一个AJAX队列。

function ajaxQueue(step) {
          switch(step) {
            case 0: $.ajax({
                      type: "POST",
                      url: "url",
                      data: SoapRequest1,
                      contentType: "text/xml",
                      complete: storeData1                          
                     }); break;
            case 1: $.ajax({
                      type: "POST",
                      url: "url",
                      data: SoapRequest2,
                      contentType: "text/xml",
                      complete: storeData2
                    }); break;
            case 2: $.ajax({
                      type: "POST",
                      url: "url",
                      data: SoapRequest3,
                      contentType: "text/xml",
                      complete: storeData3
                    }); break;
          }
        }       
        //start ajaxQueue
        ajaxQueue(0);

        function storeData1(xmlHttpRequest, status) 
        {                                           
                updateData1(xmlHttpRequest.responseXML);
                ajaxQueue(1);           
        }

        function storeData2(xmlHttpRequest, status) 
        {
              updateData2(xmlHttpRequest.responseXML);
                ajaxQueue(2);
      }

        function storeData3(xmlHttpRequest, status) 
        {
                updateData3(xmlHttpRequest.responseXML);

      }

现在我有以下问题:如果函数被执行,只有第一种情况会从 web 服务返回正确的 XML。第二次和第三次调用导致错误。 (解析错误,数据为空)。

调用是跨域的,被抑制:

 netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");

如果我在每个调用中添加 async:false,它们都会正确执行。 如果我更改调用的顺序,总是第一个正确执行。

谁能帮我解决这个问题?或者如果您需要更多信息,请告诉我。

谢谢!

【问题讨论】:

  • parse error, data is null > 传递给 $.ajax 时,SoapRequest2SoapRequest3 不是 null 吗?

标签: javascript jquery ajax web-services post


【解决方案1】:

嗯,如果我要链接 ajax 调用,我只会将第二个调用放在第一个调用成功处理程序或它的一些变体中。

$.ajax( {
   url: 'blah.com',
   success: function( result ) {
      $.ajax( {
         url: 'blah.com',
         success: function( result ) {
            // now in second leg of the chain.
            // you can keep going like this forever.

         }
      } );
   }
} );

【讨论】:

    【解决方案2】:

    使用回调(当 AJAX 请求完成时调用的东西),将其作为参数传递到您的队列中:

    function ajaxQueue(step, callback) {
          switch(step) {
            case 0: $.ajax({
                      type: "POST",
                      url: "url",
                      data: SoapRequest1,
                      contentType: "text/xml",
                      complete: callback                          
                     }); break;
            case 1: $.ajax({
                      type: "POST",
                      url: "url",
                      data: SoapRequest2,
                      contentType: "text/xml",
                      complete: callback
                    }); break;
            case 2: $.ajax({
                      type: "POST",
                      url: "url",
                      data: SoapRequest3,
                      contentType: "text/xml",
                      complete: callback
                    }); break;
          }
        }       
    
        //start ajaxQueue
        ajaxQueue(0, function() {
            // do something when ajaxQueue(0) has returned from AJAX call
        });
    
        function storeData1(xmlHttpRequest, status) 
        {          
             // passes updateData1 as a callback, automatically passes params from AJAX call                                                 
             ajaxQueue(1, updateData1);           
        }
    

    【讨论】:

    • 感谢您的回答。我也试过了,但第二次和第三次 POST 仍然没有返回任何数据......
    • 在函数顶部放置一条调试语句以检查step,并在每种情况下在AJAX调用之前检查SoapRequestX的值
    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多