2016-07-01 9 views
1

ブックの詳細がvm.booksに読み込まれた後にのみ、 "Test Data"テキストがコンソールに表示されるようにするには、基本的に同期ajax呼び出しを実行します。同期Jquery Ajaxコール

以下のコードは、期待どおりに動作しません。どのようにこの期待された機能を達成するための提案。 「テストデータ」テキストがブックの詳細はvm.booksにロードされているだけ 後にコンソールに表示され得ることを確実にする方法

$(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

クロスドメインリクエストとデータタイプ: "jsonp"リクエストは同期操作をサポートしていません。 http://api.jquery.com/jquery.ajax/ – jcubic

+0

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

+0

予想される機能をどのように達成するかについての提案。 – sameer

答えて

1

、基本的に 同期AJAX呼び出しを実行したいです。

jQuery Deferred Objectの.done機能を利用するだけです。

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

    }); 
    //do what you want or call the function you want 
    console.log("Test Data"); 
    }) 
    .fail(function(xhr, status, error) { 
    alert(status); 
    }); 
}; 
+0

編集のために多くの感謝、私は私の答えを改善する必要があります – Mikel

+0

私たちは、self.loadBooks関数を変更することはできませんloadBooksの責任は、self.books配列を読み込むことです。私たちはloadBooksを呼び出すだけで、books配列がその中に値を持つことを期待し、次にテキストを表示して書籍配列を操作する必要があります。つまり、配列内の書籍リストを表示できます。 – sameer

+0

@sameer loadBooksからajax約束を返すことができ、 'vm.loadBooks()。done(function(){Console.log(" Test Data ");});' – jcubic

0

@jcubicが正しく、jsonpはasync = falseの同期呼び出しをサポートしていません。

したがって、

  • 設定し、原点の詳細(すなわち起源は=(すなわちsomewebapiurl)サービス側でCORSを有効に "http:// localhostを:19410" ヘッダ= "*" メソッド=」予想通り今では働いている

偽 =データ型= 'JSONP' 削除

  • 留保非同期の取得」)