jQuery延迟:$.when()包含多个对象

前端之家收集整理的这篇文章主要介绍了jQuery延迟:$.when()包含多个对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要一种方法来使用回调来获取不同的脚本.
这种方法可行:
  1. fetchScripts:function() {
  2. var _this=this;
  3. $.when(
  4. $.ajax({
  5. url:_this.url + 'library/script-one.js',type:'get',cache:true
  6. }),$.ajax({
  7. url:_this.url + 'library/script-two.js',{ .... },$.ajax({
  8. url:_this.url + 'library/script-n.js',cache:true
  9. })
  10. ).then(function() {
  11. console.log('fetch is done');
  12.  
  13. })
  14. },

但我想更加概括该方法,因为冗余正在增加.
是否有可能将承诺传递给$.when()?
在我的第一次尝试之下 – 但是url总是相同的,即’script-n.js’
也许我错过了这一点,你可以说明一个更“美”的解决方

  1. fetchScripts:function() {
  2. this.deferred=new $.Deferred();
  3. this.promise=this.deferred.promise();
  4. var _this=this;
  5. $.each([
  6. 'script-one.js','script-two.js',( .... ),'script-n.js'
  7. ],function() {
  8. _this.script=this;
  9. _this.promise.then(function(){
  10. return $.ajax({
  11. url:_this.url + 'library/' + _this.script,cache:true
  12. })
  13. });
  14. });
  15. $.when(
  16. this.promise
  17. ).then(function() {
  18. console.log('fetch is done');
  19.  
  20. });
  21. this.deferred.resolve();
  22. },

解决方法

你还需要$.when.但相反,创建一个Deferreds(或promises)数组,然后创建 apply到$.when:
  1. fetchScripts:function() {
  2. var base = this.url;
  3. var defaults = {
  4. type:'get',cache:true
  5. };
  6.  
  7. var libraries = [
  8. 'library/script-one.js','library/script-two.js','library/script-n.js'
  9. ];
  10.  
  11. var deferreds = $.map(libraries,function(current) {
  12. var ajaxOptions = $.extend({ url: base + current },defaults);
  13. return $.ajax(ajaxOptions);
  14. });
  15.  
  16. $.when.apply($,deferreds).then(function() {
  17. console.log('All done');
  18. });
  19. }

或者扩展默认设置,您可以使用$.ajax(defaults).

猜你在找的jQuery相关文章