2012-01-21 5 views
0

Я использую Backbone.js и jQuery 1.7 в своем приложении, и у меня есть некоторые проблемы с сборкой. В коллекции у меня есть метод, который должен возвращать некоторый объект. Я возвращаюсь в функцию $ .ajax (...) success().Где я должен поставить заявление возврата

В этом случае я получаю «неопределенный» вместо ожидаемого объекта. Я понимаю, что проблема заключается в «возврате» - это делает функцию success() возвратом некоторого значения. Но мне нужен метод getDomainZones() сделать возврат. Как мне это сделать?

window.DmnList = Backbone.Collection.extend({ 
     model: DmnItem, 
     localStorage: new Store("hosting.WhoIs"), 
     destroyAll: function (options) { 
      while (this.models.length > 0) { 
       this.models[0].destroy(options); 
      } 
     }, 
     getDomainZones: function(){ 
      $.ajax({ 
       url: 'http://hosting/rest/getDomains', 
       type: 'GET', 
       dataType: 'json', 
       cache: 'false', 
       timeout: 5000, 
       success: function(data) { 
        console.log(data); 
        return data;//problem here 
       }, 
       error: function(jqXHR, textStatus, errorThrown) { 
        console.log("Error[getDomainZones]: " + textStatus); 
        console.log(jqXHR); 
       }, 
      }); 
     } 
}); 
+1

Миллион дубликатов. Все слишком локализованы, чтобы быть помечены как дубликаты. Г! –

ответ

3

"Где я должен поместить оператор возврата"

Nowhere. Вы не можете вернуть результат асинхронного AJAX-запроса.

Любой код, который полагается на data, должен быть назван внутриsuccess обратного вызова.


Одна возможность иметь свой getDomainZones метод получить функцию, которая будет вызываться, когда будет получен ответ.

getDomainZones: function(callback){ 
    $.ajax({ 
     url: 'http://hosting/rest/getDomains', 
     type: 'GET', 
     dataType: 'json', 
     cache: 'false', 
     timeout: 5000, 

    // success: callback, // alternative if there's no other work to do. 
     success: function(data) { 
      console.log(data); 

      callback(data); // invoke the function received 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      console.log("Error[getDomainZones]: " + textStatus); 
      console.log(jqXHR); 
     }, 
    }); 
} 

Итак вы бы передать функцию getDomainZones, и когда будет получен ответ, getDomainZones будет вызывать функцию, которую вы прошли, минуя его data.

getDomainZones(function(d) { 
    // do something with the data 
    console.log(d); 
}); 
+0

«асинхронный асинхронный javascript и xml» –

+0

«AJAX» или «Асинхронный XMLHttpRequest» (лучше) –

+0

Да, хорошее решение. В качестве альтернативы используйте объект обещания. –

Смежные вопросы