2015-06-18 82 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) –