2015-06-18 114 views
-1

我怎樣才能調用一個函數,然後當它完成時,調用另一個函數傳遞第一個函數的返回值作爲參數?我讀了很多關於Deferred,但無法弄清楚它是如何工作的。jQuery函數同步調用

https://api.jquery.com/category/deferred-object/

https://api.jquery.com/jQuery.Deferred/等主要SO ..

下面是一些例子:

function a() { 
    new amodel.AModel().save(vm.elem).done(function(_elem) { 
     vm.elem(_elem);  
    }).fail(function(error) { 
     ... 
}); 

function b(param) { 
    ... 
} //should call this with the a() return value 

我試圖使它作爲後續工作:

$.when(a()).then(b()); 

這樣我就無法傳遞參數,我甚至不確定如果它符合我的要求。

UPDATE:

對不起,我寫的是錯誤的。我不必將返回值作爲參數傳遞,因爲當函數a運行並完成時,它將設置將用於函數b中ajax調用參數的值(vm.elem(_elem))。

+0

您的例子並不做任何事情異步。你是否過分簡化了它,或者你的實際問題中的代碼做了異步? – Quentin

+0

它不是一個異步調用,但函數'a'完成後應調用函數'b'(都是ajax調用) –

+0

「它不是異步調用」和「都是ajax調用」 - 您只是自相矛盾。這是真的嗎? – Quentin

回答

4

如果a返回一個承諾,那麼它會自動地在串聯起來使用then

你想因此,所a().then(b)當結果傳遞給b

請注意,b不會傳遞括號,這會將調用b的結果傳遞給鏈。你實際上正在做的是將參考文獻b加入鏈中,並說「當你解決了a的結果時,致電b」。

這裏是演示了一個活生生的例子:http://jsfiddle.net/9wvb1d2a/

+0

'a'返回一個承諾。所以它的'a()。then(b)'而不是'$ .when(a())。then(b)'? –

+0

@KissKoppány查看更新示例。 – Jamiec

+0

我得到這個錯誤:'未捕獲的TypeError:無法讀取屬性'然後'未定義'。忘了提及,我正在使用淘汰賽(durandal) –