promise.js 7.3 KB

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