代码之家  ›  专栏  ›  技术社区  ›  OLA

jQuery延迟错误:无法读取udefined的属性'then'

  •  0
  • OLA  · 技术社区  · 5 年前

    在将数组用于整个程序之前,我试图缓存数组的值。我使用jQuery延迟对象。我以为我理解了这个概念,但看起来我可能遗漏了一块拼图。请查看下面的代码。我得到错误: Uncathed TypeError:无法读取undefined的属性'then'

    我做错了什么?

    var cacheNavData = [];
    var cacheSubNavData = [];
    var cacheMegaMenuData = [];
    var cacheCategoryMenuData = [];
    
    
    getSubNavData();
    getMegaMenuData();
    getCategoryMenuData();
    
    function getNavData(){
         var dfd = jQuery.Deferred();
      console.log(dfd)
    
         setTimeout(function(){ 
          cacheNavData[0] = "Soup";
          cacheNavData[1] = "Sandwich";
          cacheNavData[2] = "Rice";
    
         return dfd.resolve(cacheNavData);
         }, 3000);
     }
    
     function getSubNavData(){
         var dfd = jQuery.Deferred();
    
         setTimeout(function(){ 
          cacheSubNavData[0] = "Apple";
          cacheSubNavData[1] = "Beans";
          cacheSubNavData[2] = "Carrot";
    
          return dfd.resolve(cacheSubNavData);
        }, 3000);
     }
    
     function getMegaMenuData(){
         var dfd = jQuery.Deferred();
    
          setTimeout(function(){ 
          cacheMegaMenuData[0] = "Donkey";
          cacheMegaMenuData[1] = "Eagle";
          cacheMegaMenuData[2] = "Frog";
    
          return dfd.resolve(cacheMegaMenuData);
         }, 3000);
    }
    
    function getCategoryMenuData(){
         var dfd = jQuery.Deferred();
    
         setTimeout(function(){ 
          cacheCategoryMenuData[0] = "Grapes";
          cacheCategoryMenuData[1] = "Hand";
          cacheCategoryMenuData[2] = "Igloo"; 
    
         return dfd.resolve(cacheCategoryMenuData);
         }, 3000);
     }
    
     function createNavigation(){
       console.log("All arrays have been populated.  Let's build the navigation.")
     }
    
    var promise = getNavData();
    
    promise.then(getSubNavData).then(getMegaMenuData).then(getCategoryMenuData).done(function(){
      createNavigation();
    
     console.log(cacheNavData);
     console.log(cacheSubNavData);
     console.log(cacheMegaMenuData);
     console.log(cacheCategoryMenuData);
    })
    

    pen

    1 回复  |  直到 5 年前
        1
  •  0
  •   Vishnu    5 年前

    var cacheNavData = [];
    var cacheSubNavData = [];
    var cacheMegaMenuData = [];
    var cacheCategoryMenuData = [];
    
    
    getSubNavData();
    getMegaMenuData();
    getCategoryMenuData();
    
    function getNavData(){
         var dfd = jQuery.Deferred();
      
    
         setTimeout(function(){ 
          cacheNavData[0] = "Soup";
          cacheNavData[1] = "Sandwich";
          cacheNavData[2] = "Rice";
    
          dfd.resolve(cacheNavData);
         }, 3000);
      return dfd;
     }
    
    
     function getSubNavData(){
         var dfd = jQuery.Deferred();
    
         setTimeout(function(){ 
          cacheSubNavData[0] = "Apple";
          cacheSubNavData[1] = "Beans";
          cacheSubNavData[2] = "Carrot";
    
           dfd.resolve(cacheSubNavData);
        }, 3000);
       return dfd;
     }
    
     function getMegaMenuData(){
         var dfd = jQuery.Deferred();
    
          setTimeout(function(){ 
          cacheMegaMenuData[0] = "Donkey";
          cacheMegaMenuData[1] = "Eagle";
          cacheMegaMenuData[2] = "Frog";
    
           dfd.resolve(cacheMegaMenuData);
         }, 3000);
       return dfd;
    }
    
    function getCategoryMenuData(){
         var dfd = jQuery.Deferred();
    
         setTimeout(function(){ 
          cacheCategoryMenuData[0] = "Grapes";
          cacheCategoryMenuData[1] = "Hand";
          cacheCategoryMenuData[2] = "Igloo"; 
    
          dfd.resolve(cacheCategoryMenuData);
         }, 3000);
      return dfd;
     }
    
     function createNavigation(){
       console.log("All arrays have been populated.  Let's build the navigation.")
     }
    
    var promise = getNavData();
    
    promise.then(getSubNavData).then(getMegaMenuData).then(getCategoryMenuData).done(function(){
      createNavigation();
    
     console.log(cacheNavData);
     console.log(cacheSubNavData);
     console.log(cacheMegaMenuData);
     console.log(cacheCategoryMenuData);
    })
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

    认为你错过了承诺的回报:-

    function getNavData(){
     var dfd = jQuery.Deferred();
    
    
     setTimeout(function(){ 
      cacheNavData[0] = "Soup";
      cacheNavData[1] = "Sandwich";
      cacheNavData[2] = "Rice";
    
     return dfd.resolve(cacheNavData);
     }, 3000);
     return dfd;
    }