Javascript jquery$.when.apply().未触发

Javascript jquery$.when.apply().未触发,javascript,jquery,promise,Javascript,Jquery,Promise,除了$.when.apply($,promissions.done()函数外,我有以下代码正在工作(我有控制台日志显示事情处理的时间) 我不明白为什么.done不起作用 代码基本上是为过滤器容器中的每个select使用索引数据库中的值填充select,这是它自己的函数并返回一个承诺。我可以看到所有东西都在工作,但最终的.done应该在所有东西都呈现后在屏幕上显示项目,但是屏幕元素不显示,页面保持白色 grid.genPage = function() { console.time

除了
$.when.apply($,promissions.done()
函数外,我有以下代码正在工作(我有控制台日志显示事情处理的时间)

我不明白为什么
.done
不起作用

代码基本上是为过滤器容器中的每个select使用索引数据库中的值填充select,这是它自己的函数并返回一个承诺。我可以看到所有东西都在工作,但最终的
.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')从不出现在控制台中。我确信这是一个没有正确解决的问题,但我看不出在哪里


提前感谢

您需要解析第一个
延迟
对象,以便触发
然后()
成功回调:

self.resolve();

您需要解析第一个
deferred
对象,以便触发
then()
成功回调:

self.resolve();

只是想知道,使用
总是(…)
会得到同样的结果吗?是否确定已解析差异对象???快速检查“long-long-code”,你永远不会解析第一个延迟对象
快速检查“long-long-code”,你永远不会解析第一个延迟对象
(你把它当作promise btw),所以为了确保,在
内部设置
console.log()
,然后在它前面设置一个
console.log('deferred-resolved');$。应用($,承诺)。然后(…)。你的问题还在
$上吗?when()
?@A.Wolff yousir是明星-是第一个
$缺少的
self.resolve()
。Deffered()
阻碍了一切。如果您将其添加为答案,我会将其标记为正确。请将@A.Wolff answer标记为正确。只是想知道,使用
始终(…)
得到相同的结果?是否确定已解析差异对象???快速检查“long-long-code”,你永远不会解析第一个延迟对象
快速检查“long-long-code”,你永远不会解析第一个延迟对象
(你把它当作promise btw),所以为了确保,在
内部设置
console.log()
,然后在它前面设置一个
console.log('deferred-resolved');$。应用($,承诺)。然后(…)。你的问题还在
$上吗?when()
?@A.Wolff yousir是明星-是第一个
$缺少的
self.resolve()
。Deffered()
阻碍了一切。如果你加上这个作为答案,我会将它标记为正确。请将@A.Wolff answer标记为正确