AsyncParallelBailHook.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const Hook = require("./Hook");
  7. const HookCodeFactory = require("./HookCodeFactory");
  8. class AsyncParallelBailHookCodeFactory extends HookCodeFactory {
  9. content({ onError, onResult, onDone }) {
  10. let code = "";
  11. code += `var _results = new Array(${this.options.taps.length});\n`;
  12. code += "var _checkDone = function() {\n";
  13. code += "for(var i = 0; i < _results.length; i++) {\n";
  14. code += "var item = _results[i];\n";
  15. code += "if(item === undefined) return false;\n";
  16. code += "if(item.result !== undefined) {\n";
  17. code += onResult("item.result");
  18. code += "return true;\n";
  19. code += "}\n";
  20. code += "if(item.error) {\n";
  21. code += onError("item.error");
  22. code += "return true;\n";
  23. code += "}\n";
  24. code += "}\n";
  25. code += "return false;\n";
  26. code += "}\n";
  27. code += this.callTapsParallel({
  28. onError: (i, err, done, doneBreak) => {
  29. let code = "";
  30. code += `if(${i} < _results.length && ((_results.length = ${
  31. i + 1
  32. }), (_results[${i}] = { error: ${err} }), _checkDone())) {\n`;
  33. code += doneBreak(true);
  34. code += "} else {\n";
  35. code += done();
  36. code += "}\n";
  37. return code;
  38. },
  39. onResult: (i, result, done, doneBreak) => {
  40. let code = "";
  41. code += `if(${i} < _results.length && (${result} !== undefined && (_results.length = ${
  42. i + 1
  43. }), (_results[${i}] = { result: ${result} }), _checkDone())) {\n`;
  44. code += doneBreak(true);
  45. code += "} else {\n";
  46. code += done();
  47. code += "}\n";
  48. return code;
  49. },
  50. onTap: (i, run, done, doneBreak) => {
  51. let code = "";
  52. if (i > 0) {
  53. code += `if(${i} >= _results.length) {\n`;
  54. code += done();
  55. code += "} else {\n";
  56. }
  57. code += run();
  58. if (i > 0) code += "}\n";
  59. return code;
  60. },
  61. onDone
  62. });
  63. return code;
  64. }
  65. }
  66. const factory = new AsyncParallelBailHookCodeFactory();
  67. const COMPILE = function (options) {
  68. factory.setup(this, options);
  69. return factory.create(options);
  70. };
  71. function AsyncParallelBailHook(args = [], name = undefined) {
  72. const hook = new Hook(args, name);
  73. hook.constructor = AsyncParallelBailHook;
  74. hook.compile = COMPILE;
  75. hook._call = undefined;
  76. hook.call = undefined;
  77. return hook;
  78. }
  79. AsyncParallelBailHook.prototype = null;
  80. module.exports = AsyncParallelBailHook;