2015-10-21 2 views
0

У меня есть следующий код, который работает, за исключением функции $.when.apply($, promises).done() (у меня есть ведение журнала консоли, когда вещи обрабатываются).

Я не понимаю, почему .done не работает.

Что делает код в основном для каждого выбора в контейнере фильтра, заполнить выбор со значениями из индексированного db, который является его собственной функцией и возвращает обещание. Я вижу, что все работает, но окончательный .done должен отображать элементы на экране, когда все отображается, однако элементы экрана не отображаются, а страница остается белой.

grid.genPage = function() { 
     console.time('genPage'); 
     $(grid.settings.filterContainer).hide(); 
     var gridParent = grid.e.parent('div'); 
     gridParent.hide(); 
     var promises = []; 
     return $.Deferred(function(){ 
      var self = this; 
      if (!grid.settings.startGenPage.call(this, grid)){ 
       self.reject(); 
      } 
      grid.dtOptions.oColVis.aiExclude = [0]; 
      grid.displayFields = []; 
      $.when(
       grid.buildFilter(), 
       grid.buildViews(), 
       grid.generateDataTable(grid.showColumns), 
       grid.buildManageButtons() 
      ).then(function(){ 
       console.log('start populating filters'); 
       $.each(grid.config.configs[grid.settings.defaultView], function(i, v) { 
        var p = $.Deferred(function(){ 
         var self = this; 
         var field = Object.keys(v); //get field Name 
         if ($.inArray(i, grid.configIgnorArray) > -1) { 
          console.log('ignore resolve'); 
          self.resolve(); 
         } 
         var c = v[field]; 
         if (c.filters.fieldType === 'select') { 
          var el = $('select[name="' + grid.e.prop('id') + 'Filter_' + field + '"]'); 
          var os = c.options.objectStore; 
          var idx = c.options.idx; 
          var s = c.options.lookup; 
          $.when(grid.checkCache(el, c.options.objectStore, c.options.idx, c.options.lookup)) 
          .then(function(){ 
           console.log('select resolve'); 
           self.resolve(); 
          }); 
         }else { 
          console.log('other resolve'); 
          self.resolve(); 
         } 
        }); 
        promises.push(p); 
       }); 
      }); 
     }).then(function(){ 
      $.when.apply($, promises).then(function(){ 
       console.log('end populating filters'); 
       console.log('genpage finish'); 
       grid.settings.completeGenPage.call(this, grid); 
       $(grid.settings.filterContainer).show(); 
       gridParent.show(); 
       console.timeEnd('genPage'); 
       self.resolve(); 
      }); 
     }).promise(); 
    }; 

В приведенном выше коде console.log('end populating filters'); никогда не появляются в консоли. Я уверен, что это проблема с чем-то неправильным, но я не вижу, где.

Заранее спасибо

+0

Просто интересно, тот же результат с помощью 'всегда (...)'? Вы уверены, что вы делизовали объект? Quiclkly проверяет ваш «длинный длинный код», вы никогда не разрешаете первый отложенный объект –

+0

'Quiclkly проверяет ваш длинный длинный код, вы никогда не разрешаете первый отложенный объект' (который вы поворачиваете как обещание кстати) –

+0

Так что, чтобы быть уверенным, установите 'console.log()' inside 'then()' перед этим: 'console.log ('отложенное решение'); $ .when.apply ($, обещает). then (...); '. Ваша проблема еще с '$ .when()' ??? –

ответ

4

Вы должны решить первый deferred объект для того, чтобы поджечь обратного вызова then() успеха:

self.resolve();