2013-10-20 32 views
3

假设我有三个功能作为这样:等待多个条件然后执行功能

function A() { 
    //does a jquery getJson() request and applies json data to html 
    function C() 
} 

function B() { 
    //does a jquery getJson() request and applies json data to html 
    function C() 
} 

function C(){ 
    // applies cosmetic changes to the already set html which was made be Functions A & B. 
    //for example it converts numbers 1-5 set in a span to starred rating. 
} 

的问题是,功能A和B是异步和它们的回调执行依赖于截取JSON的接收时间。并因此调用函数C在json收到的一个或另一个数据集上失败。

所以我想要的是,应该在收到两个jsons并将其数据绘制到页面上之后执行ony函数C.它只能被调用一次。

我有一种感觉,这可能是封闭式的,但我不确定。

+2

查找“拍拍承诺燕鸥”。你可以用jQuery轻松做到这一点。 – elclanrs

+0

好的。我会看看。 – codin

+0

因此,根据我得到的三个答案,他们都以某种方式推荐同步执行。我想知道如果第一个json调用失败会发生什么。也许没有其他人会执行。 – codin

回答

3

你可以使用它与您的异步调用交易的Deferred Object。这样做你的代码将在阅读顺序执行,无论何时该发回响应:

var jqxhr = $.getJSON('url', function(data) { 
    alert('first callback'); 
}); 
jqxhr.done(function() { 
    alert('second callback'); 
}); 

然后使用jQuery.when()处理多个推迟:

var jqxhr1 = $.getJSON('url1'); 
var jqxhr2 = $.getJSON('url2'); 
$.when(jqxhr1, jqxhr2).done(function(data1, data2) { 
    alert('both done'); 
}); 
+0

啊......谢谢......这正是我想要的。 – codin

1

基本上可以在当前ajax调用的成功回调中调用下一个函数。这样,你可以错开他们为了

EX:

$.getJSON("/someurl", function() { 
    B(); 
}); 
+0

好的。所以你的意思是第二次json调用只能在第一次json调用成功后才能启动。 – codin

+0

是的,下一个取决于ajax调用结果的调用应该从成功调用回调 – TGH

3

我觉得这是最简单的方法

function x() { 
    var 
    aflag = false, 
    bflag = false; 

    function a() { 
    // ajax 
    aflag = true; 
    c(); 
    } 

    function b() { 
    // ajax 
    bflag = true; 
    c(); 
    } 

    function c() { 
    if (aflag && bflag) { 
     // it's ready 
    } 
    } 
} 

,但检查了这一点https://github.com/stackp/promisejs#joining-functions

+1

嗯,这看起来对我来说目前最有用,我认为如果我能记住功能的标志,它会更好。 – codin

+0

我很抱歉,但提供了一个更好的方式wawards .. – codin

+0

没问题,这是一个Vainilla解决方案虽然 – alejandro

相关问题