4

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

functionA();
functionB();

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

4

3 回答 3

4

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

functionA(functionB);

虽然您的函数带有callback参数:

functionA(callback){
  // do stuff

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

如果您的调用变得越来越复杂,您可能需要查看库async

于 2013-06-08T23:01:02.677 回答
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

于 2013-06-08T23:06:06.777 回答
0

$.getJSON是异步调用,因此您必须functionB()在回调中调用functionA()'s $.getJSON,除非您使用同步 AJAX 请求。

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

于 2013-06-08T23:06:47.857 回答