jquery $ .ajax () и его успешный обратный вызов - куда он возвращается? - PullRequest
3 голосов
/ 02 ноября 2010

Куда возвращается обратный вызов jjery ajax success?


Я написал метод запроса, который выполняет вызов ajax, обнаруживает, предоставил ли я обратный вызов или возвращает датодуду XML-ответа.

Способ запроса:

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 ]

3 голосов
/ 02 ноября 2010

Возвращается в jquery, а jquery отбрасывает его. Если вы хотите, чтобы ваш код останавливался до тех пор, пока что-то не было загружено, используйте синхронный ajax. Но это делает страницу не отвечающей до тех пор, пока запрос ajax не будет выполнен, поэтому, пожалуйста, не делайте этого!

Пример синхронного ajax (без jquery):

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

Примечание: для совместимости с IE это немного сложнее, это всего лишь подтверждение концепции. И это будет jquery способ сделать это: Как я могу заставить jQuery выполнять синхронный, а не асинхронный Ajax-запрос?

2 голосов
/ 02 ноября 2010

С вашей точки зрения, функция не возвращается никуда. Возвращаемые значения теряются.

Ключ к асинхронной обработке заключается в том, что вы обрабатываете любые данные, связанные с событием, в обработчике событий или передаете их оттуда.

  /* ... */
  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() - это функция, которая делает что-то полезное, как только становится доступен идентификатор пользователя.

Кроме того, вам, вероятно, не следует использовать responseObj.response[0].data[0], не убедившись сначала, что это значение действительно существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...