$.get 后回调?

Callback after $.get?

我有一个 javascript 函数 foo。我希望在 foo 完成时调用 bar。我试过它作为回调。这没用。 Bar 在 foo 仍在执行 $.get 时被调用(这会在服务器上启动一个很长的 python 例程)。

  function foo(callback){
    $.get(
        url="/myurl",
        data={key:($(this).attr('data-button'))}, 
        function(returndata) {
            var array = eval(returndata);
            drawTable(array);
      });

      callback();
  }

foo(bar);

然而这有效。我很困惑为什么...

  function foo(callback){
    $.get(
        url="/myurl",
        data={key:($(this).attr('data-button'))}, 
        function(returndata) {
            var array = eval(returndata);
            drawTable(array);
            callback();
      });

  }

foo(bar);

它在第二种情况下工作,因为一旦响应到来就会调用 '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);

这是因为$.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 完成后被调用。