Callback after $.get?

Callback after $.get?

本文关键字:get after Callback      更新时间:2023-09-26

我有一个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(bar);

然而,这是有效的。我很困惑为什么。。。

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

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完成后调用。

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