У меня есть набор данных, по которому я повторяю и выполняю довольно тяжелую операцию над каждым элементом. Чтобы предотвратить зависание браузера, я установил тайм-аут 0 мс. Хотя браузер не замерзает, расчет может занять несколько секунд в зависимости от пользовательского ввода. Вот код:Ломать петлю снаружи
function calculation(){
$.each(data,function(key,value){
setTimeout(function(){
doTheHeavyLifting(value);
},0);
});
}
Теперь проблема в том, что я хочу, чтобы остановить предыдущие вычисления, если пользователь запрашивает, чтобы запустить расчет снова с новыми значениями.
Я попытался определение continueCalculating
булева вне функции, и установив, что false
в runCalculation()
перед вызовом calculation()
, и внутри calculation()
сброса его обратно в true
. Вот измененный код:
var continueCalculating=false;
function runCalculator(){
continueCalculating=false;
calculation();
}
function calculation(){
continueCalculating=true;
$.each(data,function(key,value){
setTimeout(function(){
if(continueCalculating){
doTheHeavyLifting(value);
}else{
console.log("Abort the mission!");
return false;
}
},0);
});
}
Ну, это не сделать трюк, и задним числом была довольно глупая идея в любом случае. Итак, в следующий раз я попробовал также очистить все таймауты. Вот модифицированный код:
var continueCalculating=false;
var operationQueue=[];
function runCalculator(){
continueCalculating=false;
$.each(operationQueue, function(k,v){
clearTimeout(v);
});
calculation();
}
function calculation(){
continueCalculating=true;
$.each(data,function(key,value){
operationQueue.push(setTimeout(function(){
if(continueCalculating){
doTheHeavyLifting(value);
}else{
console.log("Abort the mission!");
return false;
}
},0));
});
}
Ну, это тоже не дало результатов.
Я знаю, что $.each
медленнее, чем for
, но есть только около двух десятков пунктов, чтобы перебрать, так что, конечно, это не шея бутылки. Я не ищу способы оптимизировать этот код, мне просто нужно остановить текущий расчет. Это возможно?
Вы не должны использовать петлю здесь вообще. Если вы хотите сделать обработку элементов отменными, вы должны обработать один элемент за раз и «дать время» между ними для другого кода, чтобы прервать процесс. Вы в основном хотите рекурсивную функцию, которая использует 'setTimeout'. –