@mightyplow/jslib
Version:
js helpers library
66 lines (52 loc) • 2.07 kB
JavaScript
var _this = this;
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
import checkArray from './_checkArray';
var processViaPostMessage = function processViaPostMessage(ar, fn, resolve, chunkSize, msg) {
var values = [].concat(_toConsumableArray(ar));
window.addEventListener('message', execNext);
postMessage(msg, '*');
function execNext(_ref) {
var data = _ref.data;
if (data !== msg) {
return;
}
if (values.length) {
values.splice(0, chunkSize).forEach(fn);
postMessage(msg, '*');
} else {
resolve();
window.removeEventListener('message', execNext);
}
}
};
var processViaTimeout = function processViaTimeout(ar, fn, resolve, chunkSize, msg) {
if (ar.length) {
ar.slice(0, chunkSize).forEach(fn);
setTimeout(processViaTimeout.bind(_this, ar.slice(chunkSize), fn, resolve, chunkSize, msg));
} else {
resolve();
}
};
var createSplitMessage = function createSplitMessage() {
return 'FOR_EACH_SPLIT_' + Math.floor(Math.random() * 10000);
};
var process = typeof postMessage === 'undefined' ? processViaPostMessage : processViaTimeout;
/**
* Splits an array into chunks and breaks the execution queue to ensure reactivity.
*
* @memberOf array
* @param {Array} ar
* @param {function} fn
* @param {number} chunkSize
* @return {Promise}
*/
var chunkedForEach = function chunkedForEach() {
var ar = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Function.prototype;
var chunkSize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
checkArray(ar);
return new Promise(function (resolve, reject) {
process(ar, fn, resolve, chunkSize, createSplitMessage());
});
};
export default chunkedForEach;