|
@@ -0,0 +1,30 @@
|
|
|
+import checkArray from './_checkArray';
|
|
|
+
|
|
|
+const $postMessage = typeof postMessage !== 'undefined' && postMessage;
|
|
|
+
|
|
|
+const mkExecNextMessage = (values, fn, resolve, chunkSize, msg) => function execNext ({ data }) {
|
|
|
+ if (data !== msg) { return; }
|
|
|
+
|
|
|
+ if (values.length) {
|
|
|
+ values.splice(0, chunkSize).forEach(fn);
|
|
|
+ $postMessage(msg, '*');
|
|
|
+ } else {
|
|
|
+ resolve();
|
|
|
+ window.removeEventListener('message', execNext);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const createSplitMessage = () => `FOR_EACH_SPLIT_${Math.floor(Math.random() * 10000)}`;
|
|
|
+
|
|
|
+const chunkedForEach = (ar = [], fn = Function.prototype, chunkSize = 1) => {
|
|
|
+ checkArray(ar);
|
|
|
+ if (!$postMessage) { throw Error('postMessage not available'); }
|
|
|
+
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ const streamMessage = createSplitMessage();
|
|
|
+ window.addEventListener('message', mkExecNextMessage([...ar], fn, resolve, chunkSize, streamMessage));
|
|
|
+ $postMessage(streamMessage, '*');
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+export default chunkedForEach;
|