2016-07-01 15 views
1

Wie sicherzustellen, dass "Test Data" Text in der Konsole angezeigt werden, nur nachdem Bücher Details in vm.books geladen werden, grundsätzlich synchronen Ajax-Aufruf durchführen möchten.Synchrone Jquery Ajax Call

Unten erwähnt Code funktioniert nicht wie erwartet. irgendein Vorschlag, wie man diese erwartete Funktionalität erreicht.

$(document).ready(function() { 
    var vm = new obj.Books(); 
    vm.loadBooks(); 
    console.log("Test Data"); 
}); 

var obj = obj || {}; 
obj.Books = function() { 
    var self = this; 

    self.books = []; 

    self.loadBooks = function() { 
    $.ajax({ 
     url: "somewebapiurl", 
     dataType: 'jsonp', 
     async: false 
     }) 
     .done(function(data) { 
     $.each(data, function(idx, item) { 
      self.books.push(item); 

     }); 
     }) 
     .fail(function(xhr, status, error) { 
     alert(status); 
     }); 
    }; 
}; 
+2

Domänenübergreifende Anforderungen und dataType: "Jsonp" -Anforderungen unterstützen keine synchrone Operation. http://api.jquery.com/jquery.ajax/ – jcubic

+0

http://stackoverflow.com/questions/5943630/basic-example-of-using-ajax-with-jsonp – mplungjan

+0

jeder Vorschlag, wie die erwartete Funktionalität zu erreichen. – sameer

Antwort

1

Wie die „Testdaten“, um sicherzustellen, Text in der Konsole nur dann angezeigt bekommen nach Büchern Details in vm.books geladen werden, wollen im Grunde synchronen Ajax-Aufruf auszuführen.

Nutzen Sie einfach die .done Funktion des jQuery Deferred Objects.

+0

Vielen Dank für die Bearbeitung, ich muss meine Antworten verbessern – Mikel

+0

Wir können die Funktion self.loadBooks nicht ändern, die Verantwortung der loadBooks ist es, das self.books-Array zu laden. Wir müssen nur loadBooks aufrufen und erwarten, dass das books-Array Werte enthält und dann den Text anzeigt und mit dem books-array arbeitet, d. H. Wir können die Liste der Bücher im array anzeigen. – sameer

+0

@sameer können Sie Ajax Versprechen von loadBooks zurückgeben und dann 'vm.loadBooks() verwenden. Done (function() {console.log (" Testdaten ");});' – jcubic

0

@jcubic hatte Recht, jsonp unterstützt keinen synchronen Aufruf mit async = false.

Daher

  • Aktiviert die CORS in Serviceseite (dh somewebapiurl)
  • Set Herkunft Details (dh Ursprünge = "http: // localhost: 19410" headers = "*" Methoden =“ get“)
  • den Datentyp entfernt = 'JSONP'
  • Retained async = false

Jetzt ist es wie erwartet funktioniert.