在后台运行While循环

时间:2018-06-15 16:16:25

标签: javascript angular

我有一个基于Angular的javascript应用程序,在用户按下按钮后运行循环,然后运行循环,直到我们得到一个数字,然后循环结束。当循环运行时,当前无法在UI上执行任何其他操作是否有办法将此循环推送到后台,以便用户可以继续在UI上执行其他操作。

3 个答案:

答案 0 :(得分:2)

使用角度观察者:

int i;
char c;

i = 99; /* ASCII DEC 'c' */
c = i;  /* 'c'*/

或使用非阻止$rootscope.watch(myParam, function () {});

setInterval()

答案 1 :(得分:1)

你可以使用webworker,作为下面的示例代码(代码不是完全正常的,但它只是为了给你一个想法。

(
function () {
    var scope = self;
    var condition = false

    scope.addEventListener('message', function (event) {
        var caller = event.data;
        if(caller.name && caller.command && caller.command === 'TERMINATE'){
            return;
        }              
        start(caller);
    }, false);

    function start(){
        while (condition) {
            if(condition)
                scope.postMessage({result:"result"});                

        }
    }

})();

在angularjs控制器或服务中

if (!worker) {
                    worker = new $window.Worker("./online-capability-worker.js");
                    worker.addEventListener('message', onResponse, false);
                }
function onResponse(event) {
            var response = event.data;
            //This is my nuber returned by worker
        }

答案 2 :(得分:0)

Javascript是同步的,而事件驱动的系统允许它模仿异步语言,您的代码仍在单个线程上运行。您可以使用setTimeout递归调用函数而不是使用while循环,这样线程就有时间在每次迭代之间执行其他操作。

function incrementNumber(initial, destination){
    if(initial < destination){
        setTimeout(function(){incrementNumber(initial+1, destination}), 10);
    }else{
        alert('We found the number!');
    }
}

我想指出,我同意使用setInterval来简单地更改一个数字,但是在浏览器中(据我所知仍然如此),间隔是从回调时开始的。最初调用,如果回调本身有任何重要的执行时间(例如,ajax调用),这可能会导致意外的结果。