在javascript

时间:2015-06-17 16:49:32

标签: javascript jquery asynchronous

我正在编写javascript代码来更新用户的界面。 此任务必须在后台完成,不应阻止任何事情。 代码当前阻止/崩溃浏览器,while循环导致问题。

我想要的是等待检查和安装完成,然后再执行其他操作。我想避免在TimeOut中的TimeOut中编写场景:TimeOut,它确实有效,但它会使代码变得混乱。

updateChecking();

function updateChecking() {
    setTimeout(function() {

        if (settings.IsChecking === "True") {

            var isChecking = false;
            var isInstalling = false;

            // PROBLEM, Wait till checking is completed
            while (isChecking) {
                var timerUpdateChecker = setInterval(function() {
                    getIsCheckingUpdates().done(function(resultIsChecking) {

                        if (resultIsChecking === "False") {
                            isChecking = true;
                            clearInterval(timerUpdateChecker);
                        }
                    });
                }, 1000);

                checkForSystemUpdates();

                startCheckingDownloads();

                // PROBLEM, Wait till installing is completed
                while (isInstalling) {
                    setInstallerInterface();

                    var timerInstallChecker = setInterval(function() {

                        getIsInstallingUpdates().done(function(resultIsUpdating) {

                            if (resultIsUpdating === "False") {
                                isInstalling = true;
                                clearInterval(timerInstallChecker);
                            }
                        });
                    }, 1000);
                }

                viewUpdateInstalledAlert();

                getAvailableUpdates();

                unsetInstallerInterface();
            };
        }
    }, 0);
}

任何可以解决我问题的建议?

1 个答案:

答案 0 :(得分:2)

While循环运行,直到条件为false。现在,您将变量设置为false并调用while。所以我不确定它会如何发挥作用。根据我的理解,它应该是while(!isChecking)

也就是说,您应该尝试替换setTimeoutsetInterval并替换为events。您可以创建自定义事件,分派和收听。我认为它会更有效率。像这样:

var event = new Event('isInstalled');

在您安装的功能中,您将分派事件:

window.dispatchEvent(event);

你听这个事件来触发想要的功能。

window.addEventListener('isInstalled', function(){ 
    //whatever needs to happen when installed is done
})