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 所花费的时间。因此在 json 接收到的一个或另一个数据集上调用函数 C 失败。

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

我有一种感觉,这可能通过关闭来实现,但我不确定。

4

3 回答 3

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

于 2013-10-20T06:23:47.040 回答
3

您可以使用为您处理异步调用的延迟对象。这样做,您的代码将按阅读顺序执行,无论何时发回响应:

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

然后用于jQuery.when()处理多个 deferred :

var jqxhr1 = $.getJSON('url1');
var jqxhr2 = $.getJSON('url2');
$.when(jqxhr1, jqxhr2).done(function(data1, data2) { 
    alert('both done');
});
于 2013-10-20T06:18:07.933 回答
1

基本上可以在当前ajax调用的成功回调中调用next函数。这样你就可以按顺序错开它们

前任:

$.getJSON("/someurl", function() {
   B();
});
于 2013-10-20T06:15:53.173 回答