1

我使用 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 ,它们都会正确执行。如果我更改调用的顺序,总是第一个正确执行。

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

谢谢!

4

2 回答 2

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.

         }
      } );
   }
} );
于 2012-06-12T17:52:49.327 回答
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);           
    }
于 2012-06-12T18:55:44.760 回答