簡體   English   中英

在后台運行While循環

[英]Run While loop in the background

我有一個基於javascript的Angular應用程序,在用戶按下按鈕后會運行while循環,然后運行循環直到我們獲得一定的數字,然后循環結束。 當前,當循環運行時,無法在UI上執行任何其他操作,有沒有辦法將此循環推到后台,以便用戶可以在UI上繼續執行其他操作。

為此請使用角度觀察器:

$rootscope.watch(myParam, function () {});

或使用非阻塞setInterval()

var timer = setInterval(function () {
    if (myParam == 'what-i-need') {
        clearInterval(timer);
    }
}, 200);

您可以使用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
        }

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調用),則可能導致意外結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM