我有一个基于Angular的javascript应用程序,在用户按下按钮后运行循环,然后运行循环,直到我们得到一个数字,然后循环结束。当循环运行时,当前无法在UI上执行任何其他操作是否有办法将此循环推送到后台,以便用户可以继续在UI上执行其他操作。
答案 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调用),这可能会导致意外的结果。