max-age.js 26 KB

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