我有一个javascript函数foo。我希望在foo完成时调用bar。我试过它作为回调。这是行不通的。当foo仍在执行$ .get(它在服务器上启动一个非常长的python例程)时调用Bar。
function foo(callback){
$.get(
url="/myurl",
data={key:($(this).attr('data-button'))},
function(returndata) {
var array = eval(returndata);
drawTable(array);
});
callback();
}
FOO(巴);
然而这有效。我很困惑为什么......
function foo(callback){
$.get(
url="/myurl",
data={key:($(this).attr('data-button'))},
function(returndata) {
var array = eval(returndata);
drawTable(array);
callback();
});
}
FOO(巴);
答案 0 :(得分:1)
这是因为$.get是异步的。 来自文档...
This is a shorthand Ajax function, which is equivalent to:
$.ajax({
url: url,
data: data,
success: success,
dataType: dataType
});
你可以认为它是在一个单独的线程中运行的。所以bar()不会作为回调。但在你的第二个例子中,“function(returndata)”是$ .get的回调函数,因此在内部使用bar()将完成工作,因为现在bar()只会在$ .get完成后调用。
答案 1 :(得分:0)
它在第二种情况下工作为' bar()'一旦响应到来就被调用。现在回到回调,编写回调的简单概念如下:
function func1(callback) {
alert('func1');
callback();
}
function func2() {
alert('func2');
}
func1(func2);

所以在你的情况下,理想情况下这应该有效:
function foo(callback) {
$.get(
url = "/myurl",
data = {
key: ($(this).attr('data-button'))
},
function(returndata) {
var array = eval(returndata);
drawTable(array);
callback.call();
});
}
function bar() {
//todo
}
foo(bar);