2013-01-10 37 views
1

我有小問題,在一個JavaScript對象(類)方法之間的數據交換:如何使用屬性和方法與JavaScript類交換數據?

var TEST = (function() { 

    var TEST = function() { 

    }; 

    TEST.prototype.get = function() { 
     $.ajax({ 
      type: "GET", 
      url: "http://test.com/getall", 
      dataType: "json", 
      success: function (data) { 
       return data; // if i console log this i will get a json obj 
      } 
     }); 
    }; 

    TEST.prototype.parse = function(data) { 
     $.each(this.get(), function(k, v){ 
      console.log(v); 
     }); 
    }; 

    return TEST; 
})(); 

,所以我試圖調用一個方法在另一種方法的每個語句。問題是

答案是undefined

我也試過這樣的,但他同樣的結果

var testing = new TEST(); 
var get = testing.get(); 
testing.parse(get); 

我失去了什麼?我如何從this.get返回數據用於this.parse

感謝

回答

1

$.ajax()每默認是異步的。這意味着,您的功能get()的執行不會等到請求完成。因此,您不返回任何值,導致返回undefined

爲了讓你的get()函數能夠返回一個值,你必須以同步方式完成請求並在外部函數中設置一個變量(因爲成功本身就是另一個函數,它的返回值是沒有抓到):

TEST.prototype.get = function() { 
     var result; 

     $.ajax({ 
      type: "GET", 
      url: "http://test.com/getall", 
      async: false, // this is the important part! 
      dataType: "json", 
      success: function (data) { 
       result = data; 
      } 
     }); 

     return result; 
    }; 

編輯

正如@pebbl提到的,這將停止所有腳本執行,直到請求被完成。因此,您的整個頁面暫時會被阻止。

一般的做法是在這種情況下使用回調,一旦請求完成,就會執行回調。所以你的情況是這樣的:

TEST.prototype.get = function(cb) { 
     $.ajax({ 
      type: "GET", 
      url: "http://test.com/getall", 
      dataType: "json", 
      success: function (data) { 
       cb(data); 
      } 
     }); 
    }; 

與後來調用是這樣的:

var testing = new TEST(); 
testing.get(function(data) { 
    testing.parse(data); 
}); 
+0

它的工作原理。謝謝 – Patrioticcow

+0

我不會親自推薦這條路線,因爲我確信您知道這會導致代碼掛起,直到ajax調用完成。這可能會導致舊版瀏覽器出現更多問題。 – Pebbl

+0

@pebbl你會推薦什麼? – Patrioticcow

1

你不能建造你的函數這種方式,你是靠一個asyncronous調用,將返回它產生的正常執行流程之外。您實際可以收到您的.get函數的結果的唯一方法是使用回調。

簡單地說,您的值不是從.get函數返回的,它是從您傳遞給jQuery的.ajax方法的回調中返回的。

爲了繼續支持異步調用 - 而不是禁用異步,您將更好地重新設計代碼。

一個粗略的想法是改變你的解析功能,像這樣:

TEST.prototype.parse = function(data) { 
    this.get(function(result){ 
     $.each(result, function(k, v){ 
      console.log(v); 
     }); 
    }); 
}; 

,並相應地改變你的get函數:

TEST.prototype.get = function(callback) { 
    $.ajax({ 
     type: "GET", 
     url: "http://test.com/getall", 
     dataType: "json", 
     success: callback 
    }); 
}; 

以上僅僅是一個簡單的例子,你會明智地閱讀以下jQuery主題:

如果你設計圍繞承諾模式的代碼,你會發現它複雜在第一,但它可以讓你在你的代碼很大的權力 - 和周圍的整體回調得到堆積瘋狂,你可以在處理ajax調用時結束。

雖然從jQuery.ajax文檔中未能完全清楚,但此函數返回一個jqXHR對象,該對象實現承諾接口。所以這意味着您可以使用承諾方法done,alwaysfail

相關問題