代码之家  ›  专栏  ›  技术社区  ›  Derek Adair

jquery$.ajax()及其成功回调-返回到哪里?

  •  3
  • Derek Adair  · 技术社区  · 14 年前


    我编写了一个请求方法,该方法执行ajax调用,检测我是否提供了回调或返回响应XML的datanode。

    function request(request, dontRefresh)
    {     
       var requestXML = composeRequestXML(request); 
       $.ajax({
          url: 'someProcessor.php',
          type: 'POST',
          cache: false,
          async: dontRefresh,
          timeout: 5000,
          data: "query="+requestXML,
          success: function(response)
          {
             //parses xml into a js object
             var responseObj = parseResponseXML(response);
    
             if(request.callback){
                request.callback(responseObj);
             } else {
                // responseObj.response[0].data[0] is the data 
                // node of the response Obj.
                // this is what i see being the problem - 
                // I DON'T KNOW WHERE THIS IS RETURNED TO!!
                return responseObj.response[0].data[0];
             }
          }
       });
    }
    

    此请求将使用回调

    var requestObj = new Object();
        requestObj.callback = function(responseObj){someCallbackFunction(responseObj);};
        requestObj[0] = new Object();
        requestObj[0].module = "someModule";
        requestObj[0].action = "someModuleMethod";
    request(requestObj);
    //results are returned to the function someCallbackFunction()
    

    这是我想完成的一个例子

    var requestObj = new Object();
        requestObj[0] = new Object();
        requestObj[0].module = "userManager";
        requestObj[0].action = "GET_USERID";
    
    var userId = request(requestObj, false); //make the request asynchronous
    

    我试过把 $.ajax()

    function request(request, dontRefresh){
       return $.ajax({/*...options...*/);
    }
    

    但这绕过了我开发的xml解析器,返回了XHR对象。我想使用这种技术来注册变量。所以本质上。。。

    我将对回调使用这个方法,或者用它设置一个变量。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Community CDub    8 年前

    它被返回到jquery,jquery丢弃它。如果您想让代码在加载之前停止,请使用同步ajax。但这使得页面在ajax请求完成之前不负责任,所以请不要这样做!

    同步ajax(不带jquery)的示例:

    var ajax=new XMLHttpRequest();
    ajax.open("GET", url, false);
    ajax.send(null);
    return ajax.responseText;
    

    How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?

        2
  •  2
  •   Tomalak    14 年前

    从您的角度来看,函数不会返回到任何位置。返回值丢失。

      /* ... */
      success: function(response)
      {
         //parses xml into a js object
         var responseObj = parseResponseXML(response);
    
         if(request.callback){
            request.callback(responseObj);
         } else {
            /* do something with the data */
            setUserId(responseObj.response[0].data[0]);
         }
      }
    

    在哪里? setUserId() 是一个在用户ID可用时立即执行有用操作的函数。

    作为旁白,你可能不应该使用 responseObj.response[0].data[0] 没有首先确定那个值实际上存在。