2014-10-03 57 views
4

說我在JS推遲原型函數

function UnitTable(options){ 
    this.name = options.name; 
} 

UnitTable.prototype = { 
    query : function(){ 
    $.post('php.php', { func : "get" }, function(data){ 
     if (data) this.data = data; 
    }); 
    return this; 
    }, 

    append : function(){ 
    $('#result').append(this.data); 
    } 
} 

var unitTable = new UnitTable(options).query().append(); 

創建類的問題是,AJAX調用是異步將無法完成追加調用之前。

我試過使用$ .Deferred(),但似乎無法正確返回它(如reutrn deferred.promise())並繼續鏈接的事件。

回答

3

你不能那樣做,但你可以在query設置一個承諾值,並處理append回調:

UnitTable.prototype = { 
    query: function() { 
    this.queryPromise = $.post('php.php', {func: "get"}); 
    return this; 
    }, 
    append: function() { 
    this.queryPromise.done(function(data) { 
     $('#result').append(data); 
    }); 
    return this; 
    } 
}; 

new UnitTable(options).query().append(); 
+0

好的 - 謝謝!你認爲這是一個好方法嗎? – Tester232323 2014-10-03 22:17:50

+0

我認爲它沒問題,但你必須注意控制流程;該行不會在代碼中的下一行之前運行。 – elclanrs 2014-10-03 22:19:45

+0

不,這不是一個好的方法。如果保留了對「UnitTable(options)」實例的引用,那麼可以在更早的請求被解決之前進一步調用它的query()方法。但只有一個'this.queryPromise',所有請求將不得不「分享」它。最後一個要求解決的請求將贏得這場戰鬥,並不能保證哪個請求會是 - 首先,最後或者介於兩者之間。假設最後一個請求應該是有保證的勝利者,那麼就需要確保query()在任何新的請求發起之前中止任何先前的請求。 – 2014-10-03 22:58:36

1

您可以用普通的承諾像@elclanrs suggested做到這一點;另一個可以讓你保留大部分結構的選擇是使用回調列表。 jQuery提供了一個很好的方式來管理你的callbacks

function UnitTable(options){ 
    this.name = options.name; 
    this._appendCallbacks = $.Callbacks("once memory"); 
} 

UnitTable.prototype = { 
    query : function(){ 
    $.post('php.php', { func : "get" }, function(data){ 
     if (data) this.data = data; 
     this._appendCallbacks.fire(); 
    }); 
    return this; 
    }, 

    append : function(){ 
    this._appendCallbacks.add(
     $.proxy(function() { $('#result').append(this.data); }, this) 
    ); 
    } 
} 

var unitTable = new UnitTable(options).query().append();