promise.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. /* eslint id-length: 0, handle-callback-err: 0, no-undef: 0, no-unused-vars: 0, func-names: 0 */
  2. "use strict";
  3. var memoize = require("../..")
  4. , nextTick = require("next-tick")
  5. , Promise = require("plain-promise");
  6. module.exports = function () {
  7. return {
  8. "Regular": {
  9. Success: function (a, d) {
  10. var mfn, fn, i = 0, invoked = 0;
  11. fn = function (x, y) {
  12. return new Promise(function (res) {
  13. ++i;
  14. res(x + y);
  15. });
  16. };
  17. mfn = memoize(fn, { promise: true });
  18. mfn(3, 7).done(function (res) {
  19. ++invoked;
  20. a(res, 10, "Result #1");
  21. }, a.never);
  22. mfn(3, 7).done(function (res) {
  23. ++invoked;
  24. a(res, 10, "Result #2");
  25. }, a.never);
  26. mfn(5, 8).done(function (res) {
  27. ++invoked;
  28. a(res, 13, "Result B #1");
  29. }, a.never);
  30. mfn(3, 7).done(function (res) {
  31. ++invoked;
  32. a(res, 10, "Result #3");
  33. }, a.never);
  34. mfn(5, 8).done(function (res) {
  35. ++invoked;
  36. a(res, 13, "Result B #2");
  37. }, a.never);
  38. setTimeout(function () {
  39. a(i, 2, "Init Called");
  40. a(invoked, 5, "Cb Called");
  41. mfn(3, 7).done(function (res) {
  42. ++invoked;
  43. a(res, 10, "Again: Result");
  44. }, a.never);
  45. mfn(5, 8).done(function (res) {
  46. ++invoked;
  47. a(res, 13, "Again B: Result");
  48. }, a.never);
  49. setTimeout(function () {
  50. a(i, 2, "Init Called #2");
  51. a(invoked, 7, "Cb Called #2");
  52. mfn.delete(3, 7);
  53. mfn(3, 7).done(function (res) {
  54. ++invoked;
  55. a(res, 10, "Again: Result");
  56. }, a.never);
  57. mfn(5, 8).done(function (res) {
  58. ++invoked;
  59. a(res, 13, "Again B: Result");
  60. }, a.never);
  61. setTimeout(function () {
  62. a(i, 3, "Init After delete");
  63. a(invoked, 9, "Cb After delete");
  64. d();
  65. }, 10);
  66. }, 10);
  67. }, 10);
  68. },
  69. Error: function (a, d) {
  70. var mfn, fn, i = 0, e = new Error("Test");
  71. fn = function (x, y) {
  72. ++i;
  73. return new Promise(function (res, rej) {
  74. rej(e);
  75. });
  76. };
  77. mfn = memoize(fn, { promise: "done", dispose: a.never });
  78. mfn(3, 7).done(a.never, function (err) {
  79. a(err, e, "Result #1");
  80. });
  81. mfn(5, 8).done(a.never, function (err) {
  82. a(err, e, "Result B #2");
  83. });
  84. setTimeout(function () {
  85. a(i, 2, "Called #2");
  86. mfn(3, 7).done(a.never, function (err) {
  87. a(err, e, "Again: Result");
  88. });
  89. mfn(5, 8).done(a.never, function (err) {
  90. a(err, e, "Again B: Result");
  91. });
  92. setTimeout(function (err) {
  93. a(i, 4, "Again Called #2");
  94. d();
  95. }, 10);
  96. }, 10);
  97. }
  98. },
  99. "Primitive": {
  100. "Success": function (a, d) {
  101. var mfn, fn, i = 0;
  102. fn = function (x, y) {
  103. return new Promise(function (res) {
  104. ++i;
  105. res(x + y);
  106. });
  107. };
  108. mfn = memoize(fn, { promise: true, primitive: true });
  109. mfn(3, 7).done(function (res) {
  110. a(res, 10, "Result #1");
  111. }, a.never);
  112. mfn(3, 7).done(function (res) {
  113. a(res, 10, "Result #2");
  114. }, a.never);
  115. mfn(5, 8).done(function (res) {
  116. a(res, 13, "Result B #1");
  117. }, a.never);
  118. mfn(3, 7).done(function (res) {
  119. a(res, 10, "Result #3");
  120. }, a.never);
  121. mfn(5, 8).done(function (res) {
  122. a(res, 13, "Result B #2");
  123. }, a.never);
  124. setTimeout(function () {
  125. a(i, 2, "Called #2");
  126. mfn(3, 7).done(function (res) {
  127. a(res, 10, "Again: Result");
  128. }, a.never);
  129. mfn(5, 8).done(function (res) {
  130. a(res, 13, "Again B: Result");
  131. }, a.never);
  132. setTimeout(function () {
  133. a(i, 2, "Again Called #2");
  134. mfn.delete(3, 7);
  135. mfn(3, 7).done(function (res) {
  136. a(res, 10, "Again: Result");
  137. }, a.never);
  138. mfn(5, 8).done(function (res) {
  139. a(res, 13, "Again B: Result");
  140. }, a.never);
  141. setTimeout(function () {
  142. a(i, 3, "Call After delete");
  143. d();
  144. }, 10);
  145. }, 10);
  146. }, 10);
  147. },
  148. "Error": function (a, d) {
  149. var mfn, fn, i = 0, e = new Error("Test");
  150. fn = function (x, y) {
  151. return new Promise(function (res, rej) {
  152. ++i;
  153. rej(e);
  154. });
  155. };
  156. mfn = memoize(fn, { promise: "done", primitive: true });
  157. mfn(3, 7).done(a.never, function (err) {
  158. a(err, e, "Result #1");
  159. });
  160. mfn(5, 8).done(a.never, function (err) {
  161. a(err, e, "Result B #2");
  162. });
  163. setTimeout(function () {
  164. a(i, 2, "Called #2");
  165. mfn(3, 7).done(a.never, function (err) {
  166. a(err, e, "Again: Result");
  167. });
  168. mfn(5, 8).done(a.never, function (err) {
  169. a(err, e, "Again B: Result");
  170. });
  171. setTimeout(function (err) {
  172. a(i, 4, "Again Called #2");
  173. d();
  174. }, 10);
  175. }, 10);
  176. },
  177. "Primitive null arg case": function (a, d) {
  178. var mfn, x = {};
  179. mfn = memoize(
  180. function f(id) {
  181. return new Promise(function (res) {
  182. res(x);
  183. });
  184. },
  185. {
  186. promise: true,
  187. primitive: true
  188. }
  189. );
  190. mfn(null).done(function (res) {
  191. a.deep(res, x, "Args");
  192. d();
  193. }, a.never);
  194. }
  195. },
  196. "Sync Clear": function (a, d) {
  197. var mfn, fn;
  198. fn = function (x) {
  199. return new Promise(function (res) {
  200. nextTick(function () {
  201. res(x);
  202. });
  203. });
  204. };
  205. mfn = memoize(fn, { promise: true });
  206. mfn(1).done(function (res) {
  207. a(res, 1, "First");
  208. }, a.never);
  209. mfn(2).done(function (res) {
  210. a(res, 2, "Second");
  211. d();
  212. }, a.never);
  213. },
  214. "Sync Clear: Primitive": function (a, d) {
  215. var mfn, fn;
  216. fn = function (x) {
  217. return new Promise(function (res) {
  218. nextTick(function () {
  219. res(x);
  220. });
  221. });
  222. };
  223. mfn = memoize(fn, { promise: true, primitive: true });
  224. mfn(1).done(function (res) {
  225. a(res, 1, "First");
  226. }, a.never);
  227. mfn(2).done(function (res) {
  228. a(res, 2, "Second");
  229. d();
  230. }, a.never);
  231. }
  232. };
  233. };