Я пытаюсь реализовать дросселируемое обновление пользовательского интерфейса с нокаутом, то есть разделить цикл на куски с некоторым временным интервалом между ними, чтобы дать браузеру некоторую комнату для передышки, чтобы быть более отзывчивой на больших массивы.Процесс нокаута foreach в кусках с таймаутом между
Вот что я имею прямо сейчас. Моя проблема в том, что она, кажется, застревает в бесконечном цикле. Возможно, из-за отслеживания зависимостей. Что мне не хватает?
$(function(){
var ViewModel = function(){
this.items = ko.pureComputed(function(){
var observable = ko.observableArray(),
items = [];
for(var i = 0; i < 100; i++) {
items.push({ text: Math.random().toString(36).substring(7) });
}
throttledPush(observable, items);
return observable();
}, this);
};
ko.applyBindings(new ViewModel());
});
function throttledPush(obsArray, array, items, timeout) {
items = items || 5;
timeout = timeout || 500;
var cancel = false;
var i = 0;
function addItems() {
if (cancel) return;
obsArray.valueWillMutate();
for (var j = 0; j < items && i < array.length; ++j && ++i) {
console.log('push');
obsArray().push(array[i]);
}
obsArray.valueHasMutated();
if (i < array.length) setTimeout(addItems, timeout);
}
addItems();
return {
cancel: function() {
cancel = true;
},
};
}
https://jsfiddle.net/h6d4dfsc/
На данный момент ваши «предметы» не рассчитаны, потому что у него нет зависимостей. Он не использует внешние наблюдаемые данные, поэтому он никогда не будет активирован для обновления, и это победит цель использования вычисленного. Единственным наблюдаемым, которое он использует, является тот, который он создает в своем собственном теле, и его отбрасывают, как только функция заканчивается, потому что вы возвращаете только развернутый плоский массив. Поэтому я думаю, вам, возможно, потребуется переосмыслить всю концепцию. –
Вы пробовали https://github.com/brianmhunt/knockout-fast-foreach? –
@JasonSpake В моем фактическом коде есть зависимости. Я должен был сделать это более ясным в вопросе – Johan