Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

97 linhas
2.2 KiB

  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. };