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

Multiple chained jQuery AJAX POST webservice calls

本文关键字:POST Web 服务 调用 AJAX jQuery      更新时间:2023-09-26

Im using jQuery AJAX Calls to a webservice.调用必须链接。基于 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 添加到每个调用中,则所有调用都会正确执行。如果我更改调用的顺序,则始终正确执行第一个调用。

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

谢谢!

嗯,如果我链接 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.
         }
      } );
   }
} );

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