在jquery中链接函数,以便一个接一个地启动finis

时间:2013-06-08 22:51:39

标签: jquery json

我有两个函数,functionA()和functionB(),每个函数都包含$ .getJSON。而且,根据functionA()返回的数据,functionB()的行为会有所不同。我一直在用:

functionA();
functionB();

然而,通过这种设置,我有时会从functionB()获得一些意想不到的结果。我的想法是,即使functionA()的JSON调用尚未完成,functionB()的JSON调用也在启动。我的解决方法是将functionB()放在$ .getJSON的“.done”中。虽然这有效,但我想知道是否有一种更优雅的方式来链接functionA()和functionB(),这样在函数A()完全完成之前函数B()才会启动,同时我的函数B()调用在函数A()之外。

3 个答案:

答案 0 :(得分:4)

我建议使用callback语法(例如,node.js众所周知):

functionA(functionB);

虽然你的函数采用callback参数:

functionA(callback){
  // do stuff

  // when ready, run:
  return callback();
};

如果您的来电变得更加复杂,您可能需要查看图书馆 async

答案 1 :(得分:1)

有几种方法可以实现这一目标。你显然需要在执行functionB()之前等待functionA()的JSON调用完成。执行此操作的一种方法是从functionA()的JSON调用中的success()处理函数内部调用functionB(),例如:

function functionA() {
    $.getJSON(url, data, function(result) {
        // do something
        functionB();
    });
}

function functionB() {
    // do something
}

functionA();

如果您不想在functionA中对functionB进行硬编码,您也可以将其作为参数传递并以此方式调用,例如:

function functionA(callback) {
    $.getJSON(url, data, function(result) {
        // do something
        callback();
    });
}

function functionB() {
    // do something
}

functionA(functionB);

另一个更优雅和可扩展的解决方案是让functionA()的JSON调用在完成后触发自定义事件,并为该特定事件创建一个新的事件处理程序,然后触发functionB。这样,functionA和functionB保持完全解耦,不需要彼此了解,但是你仍然可以确保正确的执行顺序。 您可以在此处阅读有关触发和捕获自定义事件的信息:JQuery.trigger

答案 2 :(得分:0)

$.getJSON是异步调用,因此除非使用同步AJAX请求,否则必须在functionB()的$ .getJSON的回调中调用functionA()

要使用同步请求,您需要使用自定义async请求而不是$ .getjson将$.ajax变量设置为false。有关ajax选项,请参阅jQuery.ajax() docsjQuery.getJSon() docs显示了如何为json配置ajax的示例。