in src/Clients/Web/winjs/js/winjs.js [31593:31718]
_processBatch: function () {
var previousItem = null,
previousGroup = null,
firstItemInGroup = null,
itemsSinceStart = 0,
failed = true;
for (var i = 0; i < this._batchSize; i++) {
var item = this._itemBatch[i],
groupKey = (item ? this._groupKey(item) : null);
if (item) {
failed = false;
}
if (previousGroup && groupKey !== null && groupKey === previousGroup.key) {
// This item is in the same group as the last item. The only thing to do is advance the group's
// lastItem if this is definitely the last item that has been processed for the group.
itemsSinceStart++;
if (previousGroup.lastItem === previousItem) {
if (previousGroup.lastItem.handle !== previousGroup.firstItem.handle) {
this._releaseItem(previousGroup.lastItem);
}
previousGroup.lastItem = item;
this._handleMap[item.handle] = previousGroup;
previousGroup.size++;
} else if (previousGroup.firstItem === item) {
if (previousGroup.firstItem.handle !== previousGroup.lastItem.handle) {
this._releaseItem(previousGroup.firstItem);
}
previousGroup.firstItem = firstItemInGroup;
this._handleMap[firstItemInGroup.handle] = previousGroup;
previousGroup.size += itemsSinceStart;
}
} else {
var index = null;
if (previousGroup) {
previousGroup.lastReached = true;
if (typeof previousGroup.index === "number") {
index = previousGroup.index + 1;
}
}
if (item) {
// See if the current group has already been processed
var group = this._keyMap[groupKey];
if (!group) {
group = {
key: groupKey,
data: this._groupData(item),
firstItem: item,
lastItem: item,
size: 1
};
this._keyMap[group.key] = group;
this._handleMap[item.handle] = group;
}
if (i > 0) {
group.firstReached = true;
if (!previousGroup) {
index = 0;
}
}
if (typeof group.index !== "number" && typeof index === "number") {
// Set the indices of as many groups as possible
for (var group2 = group; group2; group2 = this._nextGroup(group2)) {
group2.index = index;
this._indexMap[index] = group2;
index++;
}
this._indexMax = index;
if (typeof this._count === "number" && !this._lastGroup && this._count <= this._indexMax) {
this._count = this._indexMax + 1;
}
}
firstItemInGroup = item;
itemsSinceStart = 0;
previousGroup = group;
} else {
if (previousGroup) {
this._lastGroup = previousGroup;
if (typeof previousGroup.index === "number") {
this._count = (previousGroup.index + 1);
}
// Force a client refresh (which should be fast) to ensure that a countChanged notification is
// sent.
this._listDataNotificationHandler.invalidateAll();
previousGroup = null;
}
}
}
previousItem = item;
}
// See how many fetches have now completed
var fetch;
for (fetch = this._fetchQueue[0]; fetch && fetch.complete(failed) ; fetch = this._fetchQueue[0]) {
this._fetchQueue.splice(0, 1);
}
// Continue work on the next fetch, if any
if (fetch) {
var that = this;
// Avoid reentering _processBatch
Scheduler.schedule(function GroupDataSource_async_processBatch() {
that._continueFetch(fetch);
}, Scheduler.Priority.normal, null, "WinJS.UI._GroupDataSource._continueFetch");
} else {
this._itemBatch = null;
}
},