You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

пре 2 година
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. function defered() {
  2. let resolve, reject;
  3. let promise = new Promise((_resolve, _reject) => {
  4. resolve = _resolve;
  5. reject = _reject;
  6. });
  7. return {
  8. promise,
  9. resolve,
  10. reject
  11. };
  12. }
  13. function limit(concurrency) {
  14. let running = 0;
  15. let queue = [];
  16. function init() {
  17. if (running < concurrency) {
  18. running++;
  19. return Promise.resolve();
  20. }
  21. let defer = defered();
  22. queue.push(defer);
  23. return defer.promise;
  24. }
  25. function complete(a) {
  26. let next = queue.shift();
  27. if (next) {
  28. next.resolve();
  29. } else {
  30. running--;
  31. }
  32. return a;
  33. }
  34. return function(fn) {
  35. return function() {
  36. let args = Array.prototype.slice.apply(arguments);
  37. return init().then(() => {
  38. return fn.apply(null, args);
  39. }).finally(complete);
  40. }
  41. }
  42. }
  43. module.exports = {
  44. map: function(arr, fn, concurrency) {
  45. arr = Array.isArray(arr) ? arr : [arr];
  46. if (concurrency) {
  47. const limiter = limit(concurrency)
  48. return Promise.all(arr.map(limiter(fn)));
  49. }
  50. return Promise.all(arr.map(fn));
  51. },
  52. mapSeries: function(arr, fn) {
  53. arr = Array.isArray(arr) ? arr : [arr];
  54. return arr.reduce((promise, curr, index, arr) => {
  55. return promise.then(prev => {
  56. return fn(curr, index, arr).then(val => {
  57. prev.push(val);
  58. return prev;
  59. });
  60. })
  61. }, Promise.resolve([]));
  62. },
  63. reduce: function(arr, fn, start) {
  64. arr = Array.isArray(arr) ? arr : [arr];
  65. if (!arr.length) {
  66. return Promise.resolve(start);
  67. }
  68. return arr.reduce((promise, curr, index, arr) => {
  69. return promise.then(prev => {
  70. if (prev === undefined && arr.length === 1) {
  71. return curr;
  72. }
  73. return fn(prev, curr, index, arr);
  74. });
  75. }, Promise.resolve(start));
  76. },
  77. };