2011-10-06 1 views
1

Je suis coincé dans ce code:

reload: function() { 
      var self = this; 
      $.when(self.unload()).then(function() { 
       self.load(); 
      }); 
     }, 
load: function() { 
      var self = this; 
      $.ajax({ 
       url: self.options.url, 
       success: function(data) { 
        $.Deferred(
         function(dfr) { 
          $.each(data, function() { 
           var div = $('<div></div>') 
            .addClass('nw-item') 
            .html('newsitem.ejs', this) 
            .hide() 
            .appendTo(self.element); 
           dfr = dfr.pipe(function() { 
            return div.slideDown(self.options.speed); 
           }); 
          }); 
         }).resolve(); 
       } 
      }) 
     }, 
unload: function() { 
      var items = this.element.children('.nw-item').reverse(), 
       self = this, 
       udfd = $.Deferred(
        function(dfr) { 
         $.each(items, function() { 
          var div = $(this); 
          dfr = dfr.pipe(function() { 
           return div.slideUp(self.options.speed); 
          }); 
         }); 
        }).resolve(); 
      return udfd; 
     } 

dans l'ordre "reload" Je dois commencer la "charge" après séquence "décharge" est terminé, mais il commence juste après que la première itération de l'élément de séquence "décharger" soit masquée. Aidez-moi s'il vous plaît, je suis coincé (

Répondre

1

Non testé, mais essayez ceci:

unload: function() { 
    var items = this.element.children('.nw-item').reverse(); 
    var self = this; 
    var udfd = $.Deferred(); 
    var chain; 
    $.each(items, function() { 
     chain = udfd.pipe(function() { 
      return $.Deferred(function(deferred) { 
       div.slideUp(self.options.speed, function() { 
        // callback function gets executed when slideUp is done 
        deferred.resolve(); 
       });     
      }).promise(); 
     }); 
    }); 
    chain.done(function() { 
     udfd.resolve(); 
    }); 
    return udfd.promise(); 
} 

Depuis votre fonction jQuery.slideUp est asynchrone, mais ne retourne pas un objet différé comme par exemple jQuery.ajax vous devez manuellement Retourne un différé/promis Quand votre chaîne de fonctions est terminée, il résout le différé principal, n'oubliez pas de retourner une promesse pour le principal différé

Comme je l'ai dit, aucune garantie, mais vous pourriez faire un essai !