2012-03-11 2 views
1

Если у меня есть объект myApi с execute функцииJQuery AJAX слушатель

var api = new myApi(); 
api.execute(); 

Внутри execute У меня есть (* that является myApi экземпляр)

function execute() { 
     $.ajax({ 
      type: this.getRequestMethod(), 
      data: this.getDataParams(), 
      complete: function(xmlHttp){ 
       that.setResult(jQuery.parseJSON(xmlHttp.responseText)); 
       that.setHttpStatus(xmlHttp.status); 
      }, 
      url: this.getUrl(), 
      beforeSend: setHeader 
     }); 
    } 

Как я могу сделать обратный вызов/слушатель, так что я могу сделать это

var api = new myApi(); 
api.execute(); 
var result = api.getResult(); 
var statusCode = api.getStatusCode(); 
switch(statusCode) {...}; 

, если я оставлю его именно так, эти нижние две строки выполняются до завершения ajax (complete еще не вызывается), поэтому у меня есть переменные undefined.

ответ

1

Вы не можете сделать это таким образом, если только вы не заставите запросы AJAX быть синхронными (что, вероятно, является плохой идеей). Вам нужно будет добавить somekind метода обратного вызова, вы также можете использовать магию jQuery Deferred.

Таким образом, вернуть jqXHR объект, который инкапсулирует Deferred:

function execute() { 
    return $.ajax({ 
     type: this.getRequestMethod(), 
     data: this.getDataParams(), 
     complete: function(xmlHttp){ 
      that.setResult(jQuery.parseJSON(xmlHttp.responseText)); 
      that.setHttpStatus(xmlHttp.status); 
     }, 
     url: this.getUrl(), 
     beforeSend: setHeader 
    }); 
} 

, а затем использовать его как

var api = new myApi(); 
var req = api.execute(); 
req.done(function(data) { 

}); 
req.fail(function(xhr) { 
    var statusCode = xhr.status; // etc. 
}); 
Смежные вопросы