UNPKG

@mightyplow/jslib

Version:

js helpers library

66 lines (52 loc) 2.07 kB
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;