jQuery Mobile在一个函数完成后执行另一个函数

jQuery Mobile execute a function after another is completed

本文关键字:函数 另一个 执行 一个 Mobile jQuery      更新时间:2023-09-26

我试图在我的函数"aggregateTimes"完成后执行一个函数。

这是我想在运行函数之前完成的aggregateTime函数:

function aggregateTimes(date) {      
    $.ajax(
      {
        url: 'localhost/s',
        dataType : 'xml',
        success: function(data) { 
          $.each(data, function(index, calEvent){ 
          //do some work here            
        });              
      },
      error: function(){
        alert('error message');
      }
   });        
}

这是我现在调用函数的方式:

$('#mainpage').bind('pageinit', function(event) {    
  aggregateTimes(new Date()); 
  $("#calendar").jqmCalendar(
    {
      events : eventsArray,
      months : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
      days : ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
      startOfWeek : 0
    });
});

是否有办法等待函数"aggregateTimes"完成,在JQM之前?还是个新手,谢谢!

由于您使用jQuery ajax,使用complete方法在ajax完成后执行一个函数。

function aggregateTimes(date){          
  $.ajax({
    url: 'localhost/s',
    dataType : 'xml',
    success: function(data){},
    error: function(){
      alert('error message');
    },
    complete: function(){
      myCustomFN();
      //do all your stuff here when the ajax is completed
    }
  });
}

您的aggregateTimes函数发送一个AJAX请求,因此从技术上讲,它在请求收到来自服务器的响应之前完成。如果您希望代码在请求收到响应后运行,您可以将代码移动到您已经在aggregateTimes中定义的success处理程序函数的末尾,或者您可以执行以下操作:

function aggregateTimes(date){          
    return $.ajax({
        url: 'localhost/s',
        dataType : 'xml',
        success: function(data){ 
            $.each(data, function(index, calEvent){ 
                //do some work here            
            });              
        },
        error: function(){
            alert('error message');
        }
    });
}
$('#mainpage').bind('pageinit', function (event) {
    var jqXhr = aggregateTimes(new Date());
    jqXhr.done(function () {
        $("#calendar").jqmCalendar({
            events: eventsArray,
            months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
            days: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
            startOfWeek: 0
        });
    });
});

jQuery的ajax函数是一个Promise。如果你返回jQuery ajax对象,可以使用when...done方法调用另一个函数。

看起来像这样:

$.when( functionThatReturnsPromise() ).done(function () }
  // do stuff when the promise is complete
});

如果您在aggregateTimes中返回ajax对象,它将在上面的示例中填充"functionThatReturnsPromise"的角色:

function aggregateTimes(date){          
    return $.ajax({
    ....

返回ajax对象还可以简单地将函数调用视为Deferred对象:

aggregateTimes(new Date()).done(function () {
  // do stuff when aggregateTimes is done
});
文档

  • jQuery.promise - https://api.jquery.com/promise/
  • jQuery.when - https://api.jquery.com/jQuery.when/
  • jQuery.ajax - https://api.jquery.com/jQuery.ajax/
  • deferred.done - https://api.jquery.com/deferred.done/
  • jQuery Deferred Object - https://api.jquery.com/category/deferred-object/

您有几个选择。一种方法是使用回调。向aggregateTimes()添加一个附加参数,指定完成时要调用的函数。如果你喜欢的话,它可以是一个匿名函数。

function aggregateTimes(date, callback){          
    $.ajax({
        url: 'localhost/s',
        dataType : 'xml',
        success: function(data){ 
             $.each(data, function(index, calEvent){ 
                 //do some work here            
             });
             callback();
         },
         error: function(){
             alert('error message');
         }
    });
}
// ...
aggregateTimes(new Date(), function() { 
    $("#calendar").jqmCalendar({
        events : eventsArray,
        months : ["January", "February", "March", "April", "May", "June",             "July", "August", "September", "October", "November", "December"],
        days : ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
        startOfWeek : 0
     });
});

由于您使用的是jQuery,另一种选择是使用$.Deferred。让aggregateTimes()返回一个Deferred对象:

function aggregateTimes() {
    var deferred = new $.Deferred();
    //...
        success: function(data){ 
             $.each(data, function(index, calEvent){ 
                 //do some work here            
             });
             deferred.resolve();
         },
    //...
    return deferred;
}

然后在$.Deferred完成时调用第二个函数。

var wait = aggregateTimes();
wait.done(function() {
    $("#calendar").jqmCalendar({
        events : eventsArray,
        months : ["January", "February", "March", "April", "May", "June",             "July", "August", "September", "October", "November", "December"],
        days : ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
        startOfWeek : 0
     });
});