all.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. var _ = require("./_");
  2. var Promise = _.Promise;
  3. var genIterator = require("./genIterator");
  4. var tryErr = {};
  5. function tryCatch (step, key) {
  6. try {
  7. return step(key);
  8. } catch (err) {
  9. tryErr.err = err;
  10. return tryErr;
  11. }
  12. }
  13. module.exports = function (limit, list) {
  14. if (!_.isNumber(limit)) {
  15. list = limit;
  16. limit = Infinity;
  17. }
  18. return new Promise(function (resolve, reject) {
  19. var running = 0;
  20. var gen = genIterator(list);
  21. var done = false;
  22. function genNext () {
  23. running--;
  24. return step("next");
  25. }
  26. function genThrow (reason) {
  27. running--;
  28. return reject(reason);
  29. }
  30. function step (key) {
  31. if (done) {
  32. if (running === 0)
  33. resolve();
  34. return;
  35. }
  36. while (running < limit) {
  37. var info = gen[key]();
  38. if (info.done) {
  39. if (running === 0) resolve();
  40. return done = true;
  41. } else {
  42. running++;
  43. Promise.resolve(info.value).then(genNext, genThrow);
  44. }
  45. }
  46. }
  47. var ret = tryCatch(step, "next");
  48. if (ret === tryErr)
  49. reject(ret.err);
  50. });
  51. };