2015-09-08 40 views
1

我有以下代碼。javascript模式下的Ajax回調

var foo = { 
    ajaxcall : function(){ 
     var _obj = {}; 
     $.ajax({ 
      headers: { 
       'Content-Type': "application/json; charset=utf-8", 
       'dataType': "json" 
      }, 
      async: false, 
      url: "/getservertime" 
     }).done(function(resp,stat) { 
      resp = JSON.parse(resp); 
      _obj.resp = resp; 
      console.log(_obj); 
      return _obj; 
     }); 
    }, 
    init: function(){ 
     this.somefunction(this.ajaxcall()); 
    }, 
    somefunction: function(_data){ 
     console.log(_data); // coming as undefined 
    } 
} 
foo.init(); 

我如何可以等待AJAX​​的執行完成,然後再執行somefunction方法。我已經試過async: false。看起來像一些其他問題。

回答

4

我如何可以等待AJAX​​的執行完成,然後再執行somefunction方法。

你不能,沒有使用async: false,這是一個壞主意。

而是使用回調(直接或通過承諾)。這裏有一個最小的改動例如:

var foo = { 
    ajaxcall : function(callback){  // <== Accept callback 
     var _obj = {}; 
     $.ajax({ 
      headers: { 
       'Content-Type': "application/json; charset=utf-8", 
       'dataType': "json" 
      }, 
      async: false, 
      url: "/getservertime" 
     }).done(function(resp,stat) { 
      resp = JSON.parse(resp); 
      _obj.resp = resp; 
      console.log(_obj); 
      callback(_obj);    // <== Call it 
     }); 
    }, 
    init: function(){ 
     this.ajaxcall(this.someFunction.bind(this)); // <=== Pass it 
    }, 
    somefunction: function(_data){ 
     console.log(_data); // coming as undefined 
    } 
} 
foo.init(); 

注意this.someFunction.bind(this)位:創建一個新的函數,調用它時,會調用someFunction用正確的this值。現在,您寫的someFunction實際上並不關心this,但我假設它在您的真實代碼中。

2

您需要在done()處理程序中調用它。喜歡的東西:

var foo = { 
    ajaxcall : function(callback){ 
     var _obj = {}; 
     $.ajax({ 
      headers: { 
       'Content-Type': "application/json; charset=utf-8", 
       'dataType': "json" 
      }, 
      async: false, 
      url: "/getservertime" 
     }).done(function(resp,stat) { 
      resp = JSON.parse(resp); 
      _obj.resp = resp; 
      console.log(_obj); 

      callback(_obj); 
     }); 
    }, 
    init: function(){ 
     this.ajaxcall(this.somefunction); 
    }, 
    somefunction: function(_data){ 
     console.log(_data); // coming as undefined 
    } 
} 
foo.init();