多个链式jQuery AJAX POST Web服务调用

时间:2012-06-12 06:54:54

标签: javascript jquery ajax web-services post

我正在使用jQuery AJAX调用Web服务。电话必须被链接。根据{{​​3}}的解决方案,我创建了一个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);

      }

现在我遇到以下问题:如果执行该函数,则只有第一种情况从webservice返回正确的XML。第二次和第三次调用导致错误。 (parseerror,data为null)。

这些电话是跨域的,由以下人员强调:

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

如果我为每个调用添加async:false,则所有调用都会正确执行。 如果我更改了调用的顺序,则始终会正确执行第一个调用。

任何人都可以帮我这个吗?或者告诉我如果您需要更多信息。

谢谢!

2 个答案:

答案 0 :(得分:0)

嗯,如果我正在链接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.

         }
      } );
   }
} );

答案 1 :(得分:0)

使用回调(在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);           
    }