我有两个函数,functionA()和functionB(),每个函数都包含$ .getJSON。而且,根据functionA()返回的数据,functionB()的行为会有所不同。我一直在用:
functionA();
functionB();
然而,通过这种设置,我有时会从functionB()获得一些意想不到的结果。我的想法是,即使functionA()的JSON调用尚未完成,functionB()的JSON调用也在启动。我的解决方法是将functionB()放在$ .getJSON的“.done”中。虽然这有效,但我想知道是否有一种更优雅的方式来链接functionA()和functionB(),这样在函数A()完全完成之前函数B()才会启动,同时我的函数B()调用在函数A()之外。
答案 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() docs。 jQuery.getJSon() docs显示了如何为json配置ajax的示例。