Guest User

Untitled

a guest
Dec 18th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. /**
  2. * Making promises
  3. */
  4. let okPromise = Js.Promise.make((~resolve, ~reject as _) => [@bs] resolve("ok"));
  5.  
  6. /* Simpler promise creation for static values */
  7. Js.Promise.resolve("easy");
  8.  
  9. Js.Promise.reject(Invalid_argument("too easy"));
  10.  
  11. /* Create a promise that resolves much later */
  12. let timer =
  13. Js.Promise.make(
  14. (~resolve, ~reject as _) => {
  15. ignore(Js.Global.setTimeout(() => [@bs] resolve("Done!"), 1000));
  16. ()
  17. }
  18. );
  19.  
  20.  
  21. /**
  22. * Handling promise values
  23. * Note that we *have* to return a new promise inside of the callback given to then_;
  24. */
  25. Js.Promise.then_((value) => Js.Promise.resolve(Js.log(value)), okPromise);
  26.  
  27. /* Chaining */
  28. Js.Promise.then_(
  29. (value) => Js.Promise.resolve(Js.log(value)),
  30. Js.Promise.then_((value) => Js.Promise.resolve(value + 1), Js.Promise.resolve(1))
  31. );
  32.  
  33. /* Better with pipes 😉 */
  34. Js.Promise.resolve(1)
  35. |> Js.Promise.then_((value) => Js.Promise.resolve(value + 1))
  36. |> Js.Promise.then_((value) => Js.Promise.resolve(Js.log(value)));
  37.  
  38. /* And even better with some Reason spice */
  39. Js.Promise.(
  40. resolve(1)
  41. |> then_((value) => resolve(value + 1))
  42. |> then_((value) => resolve(Js.log(value)))
  43. );
  44.  
  45. /* Waiting for two values */
  46. Js.Promise.(
  47. all2((resolve(1), resolve("a")))
  48. |> then_(
  49. ((v1, v2)) => {
  50. Js.log("Value 1: " ++ string_of_int(v1));
  51. Js.log("Value 2: " ++ v2);
  52. resolve()
  53. }
  54. )
  55. );
  56.  
  57. /* Waiting for an array of values */
  58. Js.Promise.(
  59. all([|resolve(1), resolve(2), resolve(3)|])
  60. |> then_(
  61. ([|v1, v2, v3|]) => {
  62. Js.log("Value 1: " ++ string_of_int(v1));
  63. Js.log("Value 2: " ++ string_of_int(v2));
  64. Js.log("Value 3: " ++ string_of_int(v3));
  65. resolve()
  66. }
  67. )
  68. );
  69.  
  70.  
  71. /**
  72. * Error handling
  73. */
  74. /* Using a built-in OCaml error */
  75. let notFoundPromise = Js.Promise.make((~resolve as _, ~reject) => [@bs] reject(Not_found));
  76.  
  77. Js.Promise.then_((value) => Js.Promise.resolve(Js.log(value)), notFoundPromise)
  78. |> Js.Promise.catch((err) => Js.Promise.resolve(Js.log(err)));
  79.  
  80. /* Using a custom error */
  81. exception Oh_no(string);
  82.  
  83. let ohNoPromise = Js.Promise.make((~resolve as _, ~reject) => [@bs] reject(Oh_no("oh no")));
  84.  
  85. Js.Promise.catch((err) => Js.Promise.resolve(Js.log(err)), ohNoPromise);
  86.  
  87.  
  88. /**
  89. * Unfortunately, as one can see - catch expects a very generic `Js.Promise.error` value
  90. * that doesn't give us much to do with.
  91. * In general, we should not rely on rejecting/catching errors for control flow;
  92. * it's much better to use a `result` type instead.
  93. */
  94. let betterOk =
  95. Js.Promise.make((~resolve, ~reject as _) => [@bs] resolve(Js.Result.Ok("everything's fine")));
  96.  
  97. let betterOhNo =
  98. Js.Promise.make((~resolve, ~reject as _) => [@bs] resolve(Js.Result.Error("nope nope nope")));
  99.  
  100. let handleResult =
  101. Js.Promise.then_(
  102. (result) =>
  103. Js.Promise.resolve(
  104. switch result {
  105. | Js.Result.Ok(text) => Js.log("OK: " ++ text)
  106. | Js.Result.Error(reason) => Js.log("Oh no: " ++ reason)
  107. }
  108. )
  109. );
  110.  
  111. handleResult(betterOk);
  112.  
  113. handleResult(betterOhNo);
  114.  
  115.  
  116. /**
  117. * "Better living through functions."
  118. * This section is for collecting useful helper functions when handling promises
  119. */
  120. /* Get rid of the need for returning a promise every time we use `then_` */
  121. let thenResolve = (fn) => Js.Promise.then_((value) => Js.Promise.resolve(fn(value)));
  122.  
  123. Js.Promise.(resolve(1) |> thenResolve((value) => value + 1) |> thenResolve(Js.log));
  124.  
  125. /* Get rid of pesky compiler warnings at the end of a side-effectful promise chain */
  126. let thenIgnore = (fn, p) => thenResolve((value) => fn(value), p) |> ignore;
Add Comment
Please, Sign In to add comment