为什么我的承诺仍然等待.all,当每个人。然后执行?

时间:2017-10-04 21:00:44

标签: javascript jquery promise es6-promise

请看这个小提琴。我有一个globalPromiseList数组,用于控制我网站上的页面加载微调器。完成该数组中的所有promise后,删除加载微调器。首先在任何JS之前声明全局列表:

var globalPromiseList = [];

然后我可能在页面上有个别的承诺,我想在spinner隐藏页面时完成。在这里,我创建我的个人承诺,并将它们添加到全球承诺列表中。 注意:我必须设置这样的承诺,因为我正在挂钩来自第三方库的事件,我不能把代码放在包含的promise块中(参见Resolve Javascript Promise outside function scope)。

function someActionDone(id) {    
            window[id].resolve({ 
                then: function (result) {
                    console.log(id + " loaded!");
                    return result;
                }
            });
        };

        [
            ("groups-no-dropdown"),
            ("groups-default"),
            ("groups-extended"),
        ].forEach(function(id) {
            window[id] = { resolve: undefined, reject: undefined };

            window[id + "loaded"] = new Promise(function(resolve, reject) {
                window[id].resolve = resolve;
                window[id].reject = reject;
            });

            globalPromiseList.push(window[id + "loaded"]);
        });

        $(document).ready(function(){
            [("groups-no-dropdown"),
            ("groups-default"),
            ("groups-extended"),
            ].forEach(function(id) {
                  someActionDone(id);
            });
        });

然后所有承诺检查以删除微调器:

Promise.all(globalPromiseList).then(function () {
            $("#loading-overlay").css("overflow", "unset");
            $("div#page.loadingoverlay").animate({
                    opacity: "toggle"
                },
                {
                    duration: 1200,
                    specialEasing: {
                        width: "linear"
                    },
                    done: function() {
                        $("div#page.loadingoverlay").toggle(false);
                    }
                });
            console.log('all promises finished');
        });      

但是,尽管在.then中调用了控制台日志,但我的所有承诺都保持挂起状态。 请看这个例子:https://jsfiddle.net/DOTang/whwqp5nn/ 检查控制台,你会看到3条已加载的消息,但承诺仍然未决。

然后我尝试拨打resolve().then(),而不是在解决呼叫中提供:

 window[id].resolve().then( 
            function (result) {
                console.log(id + " loaded!");
                return result;
            }
        );

但这给了我一个错误:

Cannot read property 'then' of undefined

我做错了什么?

编辑感谢评论我能够解决这个问题: https://jsfiddle.net/DOTang/whwqp5nn/1/我的决心/然后使用是错误的。 它应该是这样,添加:

window[id + "loaded"].then(function(id){
         console.log(id + " loaded!");
        });

然后将comboboxDataBound更改为:

function comboboxDataBound(id) {    
  window[id].resolve(id);
};

0 个答案:

没有答案