max-age.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  1. /* eslint max-lines: 0, id-length: 0, func-names: 0, handle-callback-err: 0, max-lines: 0,
  2. no-unused-vars: 0, max-nested-callbacks: 0, no-shadow: 0, max-len: 0 */
  3. "use strict";
  4. var memoize = require("../..")
  5. , nextTick = require("next-tick")
  6. , delay = require("timers-ext/delay")
  7. , Promise = require("plain-promise");
  8. require("../../ext/async");
  9. require("../../ext/promise");
  10. module.exports = function () {
  11. return {
  12. Regular: {
  13. Sync: function (a, d) {
  14. var mfn, fn, i = 0;
  15. fn = function (x, y) {
  16. ++i;
  17. return x + y;
  18. };
  19. mfn = memoize(fn, { maxAge: 100 });
  20. a(mfn(3, 7), 10, "Result #1");
  21. a(i, 1, "Called #1");
  22. a(mfn(3, 7), 10, "Result #2");
  23. a(i, 1, "Called #2");
  24. a(mfn(5, 8), 13, "Result B #1");
  25. a(i, 2, "Called B #1");
  26. a(mfn(3, 7), 10, "Result #3");
  27. a(i, 2, "Called #3");
  28. a(mfn(5, 8), 13, "Result B #2");
  29. a(i, 2, "Called B #2");
  30. setTimeout(function () {
  31. a(mfn(3, 7), 10, "Result: Wait");
  32. a(i, 2, "Called: Wait");
  33. a(mfn(5, 8), 13, "Result: Wait B");
  34. a(i, 2, "Called: Wait B");
  35. a(mfn(9, 1), 10, "Result: C");
  36. a(i, 3, "Called: C");
  37. setTimeout(function () {
  38. a(mfn(3, 7), 10, "Result: Wait After");
  39. a(i, 4, "Called: Wait After");
  40. a(mfn(5, 8), 13, "Result: Wait After B");
  41. a(i, 5, "Called: Wait After B");
  42. a(mfn(3, 7), 10, "Result: Wait After #2");
  43. a(i, 5, "Called: Wait After #2");
  44. a(mfn(5, 8), 13, "Result: Wait After B #2");
  45. a(i, 5, "Called: Wait After B #2");
  46. a(mfn(9, 1), 10, "Result: WiatC");
  47. a(i, 5, "Called: Wait C");
  48. d();
  49. }, 70);
  50. }, 40);
  51. },
  52. Promise: function (a, d) {
  53. var mfn, fn, i = 0;
  54. fn = function (x, y) {
  55. return new Promise(function (res) {
  56. ++i;
  57. res(x + y);
  58. });
  59. };
  60. mfn = memoize(fn, { promise: true, maxAge: 100 });
  61. mfn(3, 7).done(function (res) { a(res, 10, "Result #1"); });
  62. mfn(5, 8).done(function (res) { a(res, 13, "Result #2"); });
  63. mfn(3, 7).done(function (res) { a(res, 10, "Result #3"); });
  64. mfn(3, 7).done(function (res) { a(res, 10, "Result #4"); });
  65. mfn(5, 8).done(function (res) { a(res, 13, "Result #5"); });
  66. setTimeout(function () {
  67. a(i, 2, "Called #2");
  68. mfn(3, 7).done(function (res) { a(res, 10, "Again: Result #1"); });
  69. mfn(5, 8).done(function (res) { a(res, 13, "Again: Result #2"); });
  70. setTimeout(function () {
  71. a(i, 2, "Again Called #2");
  72. mfn(3, 7).done(function (res) { a(res, 10, "Again: Result #1"); });
  73. mfn(5, 8).done(function (res) { a(res, 13, "Again: Result #2"); });
  74. nextTick(function () {
  75. a(i, 4, "Call After clear");
  76. d();
  77. });
  78. }, 100);
  79. }, 20);
  80. },
  81. Async: function (a, d) {
  82. var mfn, fn, u = {}, i = 0;
  83. fn = function (x, y, cb) {
  84. nextTick(function () {
  85. ++i;
  86. cb(null, x + y);
  87. });
  88. return u;
  89. };
  90. mfn = memoize(fn, { async: true, maxAge: 100 });
  91. a(
  92. mfn(3, 7, function (err, res) { a.deep([err, res], [null, 10], "Result #1"); }),
  93. u, "Initial"
  94. );
  95. a(
  96. mfn(3, 7, function (err, res) { a.deep([err, res], [null, 10], "Result #2"); }),
  97. u, "Initial #2"
  98. );
  99. a(
  100. mfn(5, 8, function (err, res) {
  101. a.deep([err, res], [null, 13], "Result B #1");
  102. }),
  103. u, "Initial #2"
  104. );
  105. a(
  106. mfn(3, 7, function (err, res) { a.deep([err, res], [null, 10], "Result #3"); }),
  107. u, "Initial #2"
  108. );
  109. a(
  110. mfn(5, 8, function (err, res) {
  111. a.deep([err, res], [null, 13], "Result B #2");
  112. }),
  113. u, "Initial #3"
  114. );
  115. setTimeout(function () {
  116. a(i, 2, "Called #2");
  117. a(
  118. mfn(3, 7, function (err, res) {
  119. a.deep([err, res], [null, 10], "Again: Result");
  120. }),
  121. u, "Again: Initial"
  122. );
  123. a(
  124. mfn(5, 8, function (err, res) {
  125. a.deep([err, res], [null, 13], "Again B: Result");
  126. }),
  127. u, "Again B: Initial"
  128. );
  129. setTimeout(function () {
  130. a(i, 2, "Again Called #2");
  131. a(
  132. mfn(3, 7, function (err, res) {
  133. a.deep([err, res], [null, 10], "Again: Result");
  134. }),
  135. u, "Again: Initial"
  136. );
  137. a(
  138. mfn(5, 8, function (err, res) {
  139. a.deep([err, res], [null, 13], "Again B: Result");
  140. }),
  141. u, "Again B: Initial"
  142. );
  143. nextTick(function () {
  144. a(i, 4, "Call After clear");
  145. d();
  146. });
  147. }, 100);
  148. }, 20);
  149. }
  150. },
  151. Primitive: {
  152. Sync: function (a, d) {
  153. var mfn, fn, i = 0;
  154. fn = function (x, y) {
  155. ++i;
  156. return x + y;
  157. };
  158. mfn = memoize(fn, { primitive: true, maxAge: 100 });
  159. a(mfn(3, 7), 10, "Result #1");
  160. a(i, 1, "Called #1");
  161. a(mfn(3, 7), 10, "Result #2");
  162. a(i, 1, "Called #2");
  163. a(mfn(5, 8), 13, "Result B #1");
  164. a(i, 2, "Called B #1");
  165. a(mfn(3, 7), 10, "Result #3");
  166. a(i, 2, "Called #3");
  167. a(mfn(5, 8), 13, "Result B #2");
  168. a(i, 2, "Called B #2");
  169. setTimeout(function () {
  170. a(mfn(3, 7), 10, "Result: Wait");
  171. a(i, 2, "Called: Wait");
  172. a(mfn(5, 8), 13, "Result: Wait B");
  173. a(i, 2, "Called: Wait B");
  174. setTimeout(function () {
  175. a(mfn(3, 7), 10, "Result: Wait After");
  176. a(i, 3, "Called: Wait After");
  177. a(mfn(5, 8), 13, "Result: Wait After B");
  178. a(i, 4, "Called: Wait After B");
  179. a(mfn(3, 7), 10, "Result: Wait After #2");
  180. a(i, 4, "Called: Wait After #2");
  181. a(mfn(5, 8), 13, "Result: Wait After B #2");
  182. a(i, 4, "Called: Wait After B #2");
  183. d();
  184. }, 100);
  185. }, 20);
  186. },
  187. Async: function (a, d) {
  188. var mfn, fn, u = {}, i = 0;
  189. fn = function (x, y, cb) {
  190. nextTick(function () {
  191. ++i;
  192. cb(null, x + y);
  193. });
  194. return u;
  195. };
  196. mfn = memoize(fn, { async: true, primitive: true, maxAge: 100 });
  197. a(
  198. mfn(3, 7, function (err, res) { a.deep([err, res], [null, 10], "Result #1"); }),
  199. u, "Initial"
  200. );
  201. a(
  202. mfn(3, 7, function (err, res) { a.deep([err, res], [null, 10], "Result #2"); }),
  203. u, "Initial #2"
  204. );
  205. a(
  206. mfn(5, 8, function (err, res) {
  207. a.deep([err, res], [null, 13], "Result B #1");
  208. }),
  209. u, "Initial #2"
  210. );
  211. a(
  212. mfn(3, 7, function (err, res) { a.deep([err, res], [null, 10], "Result #3"); }),
  213. u, "Initial #2"
  214. );
  215. a(
  216. mfn(5, 8, function (err, res) {
  217. a.deep([err, res], [null, 13], "Result B #2");
  218. }),
  219. u, "Initial #3"
  220. );
  221. setTimeout(function () {
  222. a(i, 2, "Called #2");
  223. a(
  224. mfn(3, 7, function (err, res) {
  225. a.deep([err, res], [null, 10], "Again: Result");
  226. }),
  227. u, "Again: Initial"
  228. );
  229. a(
  230. mfn(5, 8, function (err, res) {
  231. a.deep([err, res], [null, 13], "Again B: Result");
  232. }),
  233. u, "Again B: Initial"
  234. );
  235. setTimeout(function () {
  236. a(i, 2, "Again Called #2");
  237. a(
  238. mfn(3, 7, function (err, res) {
  239. a.deep([err, res], [null, 10], "Again: Result");
  240. }),
  241. u, "Again: Initial"
  242. );
  243. a(
  244. mfn(5, 8, function (err, res) {
  245. a.deep([err, res], [null, 13], "Again B: Result");
  246. }),
  247. u, "Again B: Initial"
  248. );
  249. nextTick(function () {
  250. a(i, 4, "Call After clear");
  251. d();
  252. });
  253. }, 100);
  254. }, 20);
  255. },
  256. Promise: function (a, d) {
  257. var mfn, fn, i = 0;
  258. fn = function (x, y, cb) {
  259. return new Promise(function (res) {
  260. ++i;
  261. res(x + y);
  262. });
  263. };
  264. mfn = memoize(fn, { promise: true, primitive: true, maxAge: 100 });
  265. mfn(3, 7).done(function (res) { a.deep(res, 10, "Result #1"); });
  266. mfn(3, 7).done(function (res) { a.deep(res, 10, "Result #2"); });
  267. mfn(5, 8).done(function (res) { a.deep(res, 13, "Result B #1"); });
  268. mfn(3, 7).done(function (res) { a.deep(res, 10, "Result #3"); });
  269. mfn(5, 8).done(function (res) { a.deep(res, 13, "Result B #2"); });
  270. setTimeout(function () {
  271. a(i, 2, "Called #2");
  272. mfn(3, 7).done(function (res) { a.deep(res, 10, "Again: Result"); });
  273. mfn(5, 8).done(function (res) { a.deep(res, 13, "Again B: Result"); });
  274. setTimeout(function () {
  275. a(i, 2, "Again Called #2");
  276. mfn(3, 7).done(function (res) { a.deep(res, 10, "Again: Result"); });
  277. mfn(5, 8).done(function (res) { a.deep(res, 13, "Again B: Result"); });
  278. nextTick(function () {
  279. a(i, 4, "Call After clear");
  280. d();
  281. });
  282. }, 100);
  283. }, 20);
  284. }
  285. },
  286. Refetch: {
  287. Default: function (a, d) {
  288. var mfn, fn, i = 0;
  289. fn = function (x, y) {
  290. ++i;
  291. return x + y;
  292. };
  293. mfn = memoize(fn, { maxAge: 600, preFetch: true });
  294. a(mfn(3, 7), 10, "Result #1");
  295. a(i, 1, "Called #1");
  296. a(mfn(3, 7), 10, "Result #2");
  297. a(i, 1, "Called #2");
  298. a(mfn(5, 8), 13, "Result B #1");
  299. a(i, 2, "Called B #1");
  300. a(mfn(3, 7), 10, "Result #3");
  301. a(i, 2, "Called #3");
  302. a(mfn(5, 8), 13, "Result B #2");
  303. a(i, 2, "Called B #2");
  304. setTimeout(function () {
  305. a(mfn(3, 7), 10, "Result: Wait");
  306. a(i, 2, "Called: Wait");
  307. a(mfn(5, 8), 13, "Result: Wait B");
  308. a(i, 2, "Called: Wait B");
  309. setTimeout(function () {
  310. a(mfn(3, 7), 10, "Result: Wait After");
  311. a(i, 2, "Called: Wait After");
  312. a(mfn(5, 8), 13, "Result: Wait After B");
  313. a(i, 2, "Called: Wait After B");
  314. a(mfn(3, 7), 10, "Result: Wait After #2");
  315. a(i, 2, "Called: Wait After #2");
  316. a(mfn(5, 8), 13, "Result: Wait After B #2");
  317. a(i, 2, "Called: Wait After B #2");
  318. setTimeout(function () {
  319. a(i, 4, "Called: After Refetch: Before");
  320. a(mfn(3, 7), 10, "Result: After Refetch");
  321. a(i, 4, "Called: After Refetch: After");
  322. a(mfn(5, 8), 13, "Result: After Refetch B");
  323. a(i, 4, "Called: After Refetch B: After");
  324. setTimeout(function () {
  325. a(mfn(3, 7), 10, "Result: After Refetch #2");
  326. a(i, 4, "Called: After Refetch #2");
  327. a(mfn(5, 8), 13, "Result: After Refetch #2 B");
  328. a(i, 4, "Called: After Refetch #2 B");
  329. a(mfn(3, 7), 10, "Result: After Refetch #3");
  330. a(i, 4, "Called: After Refetch #3");
  331. a(mfn(5, 8), 13, "Result: After Refetch #3 B");
  332. a(i, 4, "Called: After Refetch #3 B");
  333. d();
  334. }, 200);
  335. }, 200);
  336. }, 200);
  337. }, 300);
  338. },
  339. Async: function (a, d) {
  340. var mfn, fn, i = 0;
  341. fn = function (x, y, cb) {
  342. ++i;
  343. setTimeout(function () { cb(null, x + y); }, 0);
  344. };
  345. mfn = memoize(fn, { maxAge: 600, preFetch: true, async: true });
  346. // 1.Start
  347. mfn(3, 7, function (err, result) {
  348. a(result, 10, "Result #1");
  349. a(i, 1, "Called #1");
  350. mfn(3, 7, function (err, result) {
  351. a(result, 10, "Result #2");
  352. a(i, 1, "Called #2");
  353. mfn(5, 8, function (err, result) {
  354. a(result, 13, "Result B #1");
  355. a(i, 2, "Called B #1");
  356. mfn(3, 7, function (err, result) {
  357. a(result, 10, "Result #3");
  358. a(i, 2, "Called #3");
  359. mfn(5, 8, function (err, result) {
  360. a(result, 13, "Result B #2");
  361. a(i, 2, "Called B #2");
  362. // 2. Wait 300ms
  363. setTimeout(function () {
  364. // From cache, prefetch not triggered
  365. mfn(3, 7, function (err, result) {
  366. a(result, 10, "Result: Wait");
  367. a(i, 2, "Called: Wait");
  368. mfn(5, 8, function (err, result) {
  369. a(result, 13, "Result: Wait B");
  370. a(i, 2, "Called: Wait B");
  371. // Wait 200ms
  372. setTimeout(function () {
  373. // From cache, prefetch triggered
  374. mfn(3, 7, function (err, result) {
  375. a(result, 10, "Result: Wait After");
  376. a(i, 2, "Called: Wait After");
  377. mfn(5, 8, function (err, result) {
  378. a(result, 13, "Result: Wait After B");
  379. a(i, 3, "Called: Wait After B");
  380. mfn(3, 7, function (err, result) {
  381. a(
  382. result, 10,
  383. "Result: Wait After #2"
  384. );
  385. a(i, 4, "Called: Wait After #2");
  386. mfn(5, 8, function (err, result) {
  387. a(
  388. result, 13,
  389. "Result: Wait After B #2"
  390. );
  391. a(
  392. i, 4,
  393. "Called: Wait After B #2"
  394. );
  395. // Wait 200ms
  396. setTimeout(function () {
  397. // From cache, prefetch not triggered
  398. a(
  399. i, 4,
  400. "Called: After Refetch: Before"
  401. );
  402. mfn(3, 7, function (
  403. err,
  404. result
  405. ) {
  406. a(
  407. result, 10,
  408. "Result: After Refetch"
  409. );
  410. a(
  411. i, 4,
  412. "Called: After Refetch: After"
  413. );
  414. mfn(5, 8, function (
  415. err,
  416. result
  417. ) {
  418. a(
  419. result, 13,
  420. "Result: After Refetch B"
  421. );
  422. a(
  423. i, 4,
  424. "Called: After Refetch B: After"
  425. );
  426. // Wait 250ms
  427. setTimeout(
  428. function () {
  429. // From cache, prefetch triggered
  430. mfn(
  431. 3,
  432. 7,
  433. function (
  434. err,
  435. result
  436. ) {
  437. a(
  438. result,
  439. 10,
  440. "Result: After Refetch #2"
  441. );
  442. a(
  443. i,
  444. 4,
  445. "Called: After Refetch #2"
  446. );
  447. mfn(
  448. 5,
  449. 8,
  450. function (
  451. err,
  452. result
  453. ) {
  454. a(
  455. result,
  456. 13,
  457. "Result: After Refetch #2 B"
  458. );
  459. a(
  460. i,
  461. 5,
  462. "Called: After Refetch #2 B"
  463. );
  464. mfn(
  465. 3,
  466. 7,
  467. function (
  468. err,
  469. result
  470. ) {
  471. a(
  472. result,
  473. 10,
  474. "Result: After Refetch #3"
  475. );
  476. a(
  477. i,
  478. 6,
  479. "Called: After Refetch #3"
  480. );
  481. mfn(
  482. 5,
  483. 8,
  484. function (
  485. err,
  486. result
  487. ) {
  488. a(
  489. result,
  490. 13,
  491. "Result: After Refetch #3 B"
  492. );
  493. a(
  494. i,
  495. 6,
  496. "Called: After Refetch #3 B"
  497. );
  498. d();
  499. }
  500. );
  501. }
  502. );
  503. }
  504. );
  505. }
  506. );
  507. },
  508. 250
  509. );
  510. });
  511. });
  512. }, 200);
  513. });
  514. });
  515. });
  516. });
  517. }, 200);
  518. });
  519. });
  520. }, 300);
  521. });
  522. });
  523. });
  524. });
  525. });
  526. },
  527. Promise: function (a, d) {
  528. var mfn, fn, i = 0;
  529. fn = function (x, y) {
  530. ++i;
  531. return new Promise(function (res) { res(x + y); });
  532. };
  533. mfn = memoize(fn, { maxAge: 1200, preFetch: true, promise: true });
  534. mfn(3, 7).done(function (result) {
  535. a(result, 10, "Result #1");
  536. a(i, 1, "Called #1");
  537. mfn(3, 7).done(function (result) {
  538. a(result, 10, "Result #2");
  539. a(i, 1, "Called #2");
  540. mfn(5, 8).done(function (result) {
  541. a(result, 13, "Result B #1");
  542. a(i, 2, "Called B #1");
  543. mfn(3, 7).done(function (result) {
  544. a(result, 10, "Result #3");
  545. a(i, 2, "Called #3");
  546. mfn(5, 8).done(function (result) {
  547. a(result, 13, "Result B #2");
  548. a(i, 2, "Called B #2");
  549. // 600
  550. setTimeout(function () {
  551. mfn(3, 7).done(function (result) {
  552. a(result, 10, "Result: Wait");
  553. a(i, 2, "Called: Wait");
  554. mfn(5, 8).done(function (result) {
  555. a(result, 13, "Result: Wait B");
  556. a(i, 2, "Called: Wait B");
  557. // 400
  558. setTimeout(function () {
  559. mfn(3, 7).done(
  560. // 0
  561. delay(function (result) {
  562. a(result, 10, "Result: Wait After");
  563. a(i, 3, "Called: Wait After");
  564. mfn(5, 8).done(
  565. // 0
  566. delay(function (result) {
  567. a(
  568. result, 13,
  569. "Result: Wait After B"
  570. );
  571. a(i, 4, "Called: Wait After B");
  572. mfn(3, 7).done(
  573. // next tick
  574. delay(function (result) {
  575. a(
  576. result, 10,
  577. "Result: Wait After #2"
  578. );
  579. a(
  580. i, 4,
  581. "Called: Wait After #2"
  582. );
  583. mfn(5, 8).done(
  584. function (result) {
  585. a(
  586. result, 13,
  587. "Result: Wait After B #2"
  588. );
  589. a(
  590. i, 4,
  591. "Called: Wait After B #2"
  592. );
  593. // 400
  594. setTimeout(
  595. function () {
  596. a(
  597. i,
  598. 4,
  599. "Called: After Refetch: Before"
  600. );
  601. mfn(
  602. 3, 7
  603. ).done(
  604. function (
  605. result
  606. ) {
  607. a(
  608. result,
  609. 10,
  610. "Result: After Refetch"
  611. );
  612. a(
  613. i,
  614. 4,
  615. "Called: After Refetch: After"
  616. );
  617. mfn(
  618. 5,
  619. 8
  620. ).done(
  621. function (
  622. result
  623. ) {
  624. a(
  625. result,
  626. 13,
  627. "Result: After Refetch B"
  628. );
  629. a(
  630. i,
  631. 4,
  632. "Called: After Refetch B: After"
  633. );
  634. // 400
  635. setTimeout(
  636. function () {
  637. mfn(
  638. 3,
  639. 7
  640. ).done(
  641. // 0
  642. delay(
  643. function (
  644. result
  645. ) {
  646. a(
  647. result,
  648. 10,
  649. "Result: After Refetch #2"
  650. );
  651. a(
  652. i,
  653. 5,
  654. "Called: After Refetch #2"
  655. );
  656. mfn(
  657. 5,
  658. 8
  659. ).done(
  660. // 0
  661. delay(
  662. function (
  663. result
  664. ) {
  665. a(
  666. result,
  667. 13,
  668. "Result: After Refetch #2 B"
  669. );
  670. a(
  671. i,
  672. 6,
  673. "Called: After Refetch #2 B"
  674. );
  675. mfn(
  676. 3,
  677. 7
  678. ).done(
  679. function (
  680. result
  681. ) {
  682. a(
  683. result,
  684. 10,
  685. "Result: After Refetch #3"
  686. );
  687. a(
  688. i,
  689. 6,
  690. "Called: After Refetch #3"
  691. );
  692. mfn(
  693. 5,
  694. 8
  695. ).done(
  696. function (
  697. result
  698. ) {
  699. a(
  700. result,
  701. 13,
  702. "Result: After Refetch #3 B"
  703. );
  704. a(
  705. i,
  706. 6,
  707. "Called: After Refetch #3 B"
  708. );
  709. d();
  710. }
  711. );
  712. }
  713. );
  714. },
  715. 0
  716. )
  717. );
  718. },
  719. 0
  720. )
  721. );
  722. },
  723. 400
  724. );
  725. }
  726. );
  727. }
  728. );
  729. },
  730. 400
  731. );
  732. }
  733. );
  734. })
  735. );
  736. }, 0)
  737. );
  738. }, 0)
  739. );
  740. }, 400);
  741. });
  742. });
  743. }, 600);
  744. });
  745. });
  746. });
  747. });
  748. });
  749. },
  750. Custom: function (a, d) {
  751. var mfn, fn, i = 0;
  752. fn = function (x, y) {
  753. ++i;
  754. return x + y;
  755. };
  756. mfn = memoize(fn, { maxAge: 6000, preFetch: 1 / 6 });
  757. a(mfn(3, 7), 10, "Result #1");
  758. a(i, 1, "Called #1");
  759. a(mfn(3, 7), 10, "Result #2");
  760. a(i, 1, "Called #2");
  761. a(mfn(5, 8), 13, "Result B #1");
  762. a(i, 2, "Called B #1");
  763. a(mfn(3, 7), 10, "Result #3");
  764. a(i, 2, "Called #3");
  765. a(mfn(5, 8), 13, "Result B #2");
  766. a(i, 2, "Called B #2");
  767. setTimeout(function () {
  768. a(mfn(3, 7), 10, "Result: Wait");
  769. a(i, 2, "Called: Wait");
  770. a(mfn(5, 8), 13, "Result: Wait B");
  771. a(i, 2, "Called: Wait B");
  772. setTimeout(function () {
  773. a(mfn(3, 7), 10, "Result: Wait After");
  774. a(i, 2, "Called: Wait After");
  775. a(mfn(5, 8), 13, "Result: Wait After B");
  776. a(i, 2, "Called: Wait After B");
  777. a(mfn(3, 7), 10, "Result: Wait After #2");
  778. a(i, 2, "Called: Wait After #2");
  779. a(mfn(5, 8), 13, "Result: Wait After B #2");
  780. a(i, 2, "Called: Wait After B #2");
  781. setTimeout(function () {
  782. a(i, 4, "Called: After Refetch: Before");
  783. a(mfn(3, 7), 10, "Result: After Refetch");
  784. a(i, 4, "Called: After Refetch: After");
  785. a(mfn(5, 8), 13, "Result: After Refetch B");
  786. a(i, 4, "Called: After Refetch B: After");
  787. setTimeout(function () {
  788. a(mfn(3, 7), 10, "Result: After Refetch #2");
  789. a(i, 4, "Called: After Refetch #2");
  790. a(mfn(5, 8), 13, "Result: After Refetch #2 B");
  791. a(i, 4, "Called: After Refetch #2 B");
  792. a(mfn(3, 7), 10, "Result: After Refetch #3");
  793. a(i, 4, "Called: After Refetch #3");
  794. a(mfn(5, 8), 13, "Result: After Refetch #3 B");
  795. a(i, 4, "Called: After Refetch #3 B");
  796. d();
  797. }, 2000);
  798. }, 3000);
  799. }, 1000);
  800. }, 4500);
  801. }
  802. }
  803. };
  804. };