asyncjs.html 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <!-- This file is generated by Nim. -->
  4. <html xmlns="https://www.w3.org/1999/xhtml" xml:lang="en" lang="en" data-theme="auto">
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  8. <title>std/asyncjs</title>
  9. <!-- Google fonts -->
  10. <link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
  11. <link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
  12. <!-- Favicon -->
  13. <link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
  14. <link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
  15. <!-- CSS -->
  16. <link rel="stylesheet" type="text/css" href="nimdoc.out.css?v=2.3.1">
  17. <!-- JS -->
  18. <script type="text/javascript" src="dochack.js?v=2.3.1"></script>
  19. </head>
  20. <body>
  21. <div class="document" id="documentId">
  22. <div class="container">
  23. <h1 class="title">std/asyncjs</h1>
  24. <div class="row">
  25. <div class="three columns">
  26. <div class="theme-select-wrapper">
  27. <label for="theme-select">Theme:&nbsp;</label>
  28. <select id="theme-select" onchange="setTheme(this.value)">
  29. <option value="auto">🌗 Match OS</option>
  30. <option value="dark">🌑 Dark</option>
  31. <option value="light">🌕 Light</option>
  32. </select>
  33. </div>
  34. <div id="global-links">
  35. <ul class="simple-boot">
  36. <li><a href="manual.html">Manual</a></li>
  37. <li><a href="lib.html">Standard library</a></li>
  38. <li> <a id="indexLink" href="theindex.html">Index</a></li>
  39. <li><a href="compiler/theindex.html">Compiler docs</a></li>
  40. <li><a href="https://nim-lang.github.io/fusion/theindex.html">Fusion docs</a></li>
  41. <li><a href="https://nim-lang.github.io/Nim/">devel</a>, <a href="https://nim-lang.org/documentation.html">stable</a></li>
  42. </ul>
  43. </div>
  44. <div id="searchInputDiv">
  45. Search: <input type="search" id="searchInput"
  46. oninput="search()" />
  47. </div>
  48. <ul class="simple simple-toc" id="toc-list">
  49. <li><a class="reference" id="javascript-compatibility_toc" href="#javascript-compatibility">JavaScript compatibility</a></li>
  50. <li>
  51. <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
  52. </li>
  53. <li>
  54. <details open>
  55. <summary><a class="reference reference-toplevel" href="#7" id="57">Types</a></summary>
  56. <ul class="simple simple-toc-section">
  57. <li><a class="reference" href="#Error" title="Error {.importjs: &quot;Error&quot;.} = ref object of JsRoot
  58. message*: cstring
  59. name*: cstring">Error</a></li>
  60. <li><a class="reference" href="#Future" title="Future[T] = ref object
  61. future*: T">Future</a></li>
  62. <li><a class="reference" href="#OnReject" title="OnReject = proc (reason: Error)">OnReject</a></li>
  63. <li><a class="reference" href="#PromiseJs" title="PromiseJs {.importjs: &quot;Promise&quot;.} = ref object">PromiseJs</a></li>
  64. </ul>
  65. </details>
  66. </li>
  67. <li>
  68. <details open>
  69. <summary><a class="reference reference-toplevel" href="#12" id="62">Procs</a></summary>
  70. <ul class="simple simple-toc-section">
  71. <ul class="simple nested-toc-section">catch
  72. <li><a class="reference" href="#catch%2CFuture%5BT%5D%2COnReject" title="catch[T](future: Future[T]; onReject: OnReject): Future[void]">catch[T](future: Future[T]; onReject: OnReject): Future[void]</a></li>
  73. </ul>
  74. <ul class="simple nested-toc-section">newPromise
  75. <li><a class="reference" href="#newPromise%2Cproc%28proc%29%29" title="newPromise(handler: proc (resolve: proc ())): Future[void]">newPromise(handler: proc (resolve: proc ())): Future[void]</a></li>
  76. <li><a class="reference" href="#newPromise%2Cproc%28proc%28T%29%29" title="newPromise[T](handler: proc (resolve: proc (response: T))): Future[T]">newPromise[T](handler: proc (resolve: proc (response: T))): Future[T]</a></li>
  77. </ul>
  78. <ul class="simple nested-toc-section">then
  79. <li><a class="reference" href="#then%2CFuture%5BT%5D%2Cproc%2COnReject" title="then[T](future: Future[T]; onSuccess: proc; onReject: OnReject = nil): auto">then[T](future: Future[T]; onSuccess: proc; onReject: OnReject = nil): auto</a></li>
  80. </ul>
  81. </ul>
  82. </details>
  83. </li>
  84. <li>
  85. <details open>
  86. <summary><a class="reference reference-toplevel" href="#17" id="67">Macros</a></summary>
  87. <ul class="simple simple-toc-section">
  88. <ul class="simple nested-toc-section">async
  89. <li><a class="reference" href="#async.m%2Cuntyped" title="async(arg: untyped): untyped">async(arg: untyped): untyped</a></li>
  90. </ul>
  91. </ul>
  92. </details>
  93. </li>
  94. </ul>
  95. </div>
  96. <div class="nine columns" id="content">
  97. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/js/asyncjs.nim#L1" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  98. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/js/asyncjs.nim#L1" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  99. <div id="tocRoot"></div>
  100. <p class="module-desc"><p>This module implements types and macros for writing asynchronous code for the JS backend. It provides tools for interaction with JavaScript async API-s and libraries, writing async procedures in Nim and converting callback-based code to promises.</p>
  101. <p>A Nim procedure is asynchronous when it includes the <tt class="docutils literal"><span class="pre"><span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">async</span><span class="Operator">.</span><span class="Punctuation">}</span></span></tt> pragma. It should always have a <tt class="docutils literal"><span class="pre"><span class="Identifier">Future</span><span class="Punctuation">[</span><span class="Identifier">T</span><span class="Punctuation">]</span></span></tt> return type or not have a return type at all. A <tt class="docutils literal"><span class="pre"><span class="Identifier">Future</span><span class="Punctuation">[</span><span class="Identifier">void</span><span class="Punctuation">]</span></span></tt> return type is assumed by default.</p>
  102. <p>This is roughly equivalent to the <tt class="docutils literal"><span class="pre"><span class="Identifier">async</span></span></tt> keyword in JavaScript code.</p>
  103. <p><pre class="listing"><span class="Keyword">proc</span> <span class="Identifier">loadGame</span><span class="Punctuation">(</span><span class="Identifier">name</span><span class="Punctuation">:</span> <span class="Identifier">string</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">Future</span><span class="Punctuation">[</span><span class="Identifier">Game</span><span class="Punctuation">]</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">async</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Operator">=</span>
  104. <span class="Comment"># code</span></pre></p>
  105. <p>should be equivalent to</p>
  106. <p><pre class="listing">async function loadGame(name) {
  107. // code
  108. }</pre></p>
  109. <p>A call to an asynchronous procedure usually needs <tt class="docutils literal"><span class="pre"><span class="Identifier">await</span></span></tt> to wait for the completion of the <tt class="docutils literal"><span class="pre"><span class="Identifier">Future</span></span></tt>.</p>
  110. <p><pre class="listing"><span class="Keyword">var</span> <span class="Identifier">game</span> <span class="Operator">=</span> <span class="Identifier">await</span> <span class="Identifier">loadGame</span><span class="Punctuation">(</span><span class="Identifier">name</span><span class="Punctuation">)</span></pre></p>
  111. <p>Often, you might work with callback-based API-s. You can wrap them with asynchronous procedures using promises and <tt class="docutils literal"><span class="pre"><span class="Identifier">newPromise</span></span></tt>:</p>
  112. <p><pre class="listing"><span class="Keyword">proc</span> <span class="Identifier">loadGame</span><span class="Punctuation">(</span><span class="Identifier">name</span><span class="Punctuation">:</span> <span class="Identifier">string</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">Future</span><span class="Punctuation">[</span><span class="Identifier">Game</span><span class="Punctuation">]</span> <span class="Operator">=</span>
  113. <span class="Keyword">var</span> <span class="Identifier">promise</span> <span class="Operator">=</span> <span class="Identifier">newPromise</span><span class="Punctuation">(</span><span class="Punctuation">)</span> <span class="Keyword">do</span> <span class="Punctuation">(</span><span class="Identifier">resolve</span><span class="Punctuation">:</span> <span class="Keyword">proc</span><span class="Punctuation">(</span><span class="Identifier">response</span><span class="Punctuation">:</span> <span class="Identifier">Game</span><span class="Punctuation">)</span><span class="Punctuation">)</span><span class="Punctuation">:</span>
  114. <span class="Identifier">cbBasedLoadGame</span><span class="Punctuation">(</span><span class="Identifier">name</span><span class="Punctuation">)</span> <span class="Keyword">do</span> <span class="Punctuation">(</span><span class="Identifier">game</span><span class="Punctuation">:</span> <span class="Identifier">Game</span><span class="Punctuation">)</span><span class="Punctuation">:</span>
  115. <span class="Identifier">resolve</span><span class="Punctuation">(</span><span class="Identifier">game</span><span class="Punctuation">)</span>
  116. <span class="Keyword">return</span> <span class="Identifier">promise</span></pre></p>
  117. <p>Forward definitions work properly, you just need to always add the <tt class="docutils literal"><span class="pre"><span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">async</span><span class="Operator">.</span><span class="Punctuation">}</span></span></tt> pragma:</p>
  118. <p><pre class="listing"><span class="Keyword">proc</span> <span class="Identifier">loadGame</span><span class="Punctuation">(</span><span class="Identifier">name</span><span class="Punctuation">:</span> <span class="Identifier">string</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">Future</span><span class="Punctuation">[</span><span class="Identifier">Game</span><span class="Punctuation">]</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">async</span><span class="Operator">.</span><span class="Punctuation">}</span></pre></p>
  119. <h1><a class="toc-backref" id="javascript-compatibility" href="#javascript-compatibility">JavaScript compatibility</a></h1><p>Nim currently generates <tt class="docutils literal"><span class="pre"><span class="Identifier">async</span><span class="Operator">/</span><span class="Identifier">await</span></span></tt> JavaScript code which is supported in modern EcmaScript and most modern versions of browsers, Node.js and Electron. If you need to use this module with older versions of JavaScript, you can use a tool that backports the resulting JavaScript code, as babel.</p>
  120. </p>
  121. <div class="section" id="6">
  122. <h1><a class="toc-backref" href="#6">Imports</a></h1>
  123. <dl class="item">
  124. <a class="reference external" href="jsffi.html">jsffi</a>, <a class="reference external" href="macros.html">macros</a>, <a class="reference external" href="since.html">since</a>
  125. </dl>
  126. </div>
  127. <div class="section" id="7">
  128. <h1><a class="toc-backref" href="#7">Types</a></h1>
  129. <dl class="item">
  130. <div id="Error">
  131. <dt><pre><a href="asyncjs.html#Error"><span class="Identifier">Error</span></a> {.<span class="Identifier">importjs</span><span class="Other">:</span> <span class="StringLit">&quot;Error&quot;</span>.} <span class="Other">=</span> <span class="Keyword">ref</span> <span class="Keyword">object</span> <span class="Keyword">of</span> <a href="system.html#JsRoot"><span class="Identifier">JsRoot</span></a>
  132. <span class="Identifier">message</span><span class="Operator">*</span><span class="Other">:</span> <a href="system.html#cstring"><span class="Identifier">cstring</span></a>
  133. <span class="Identifier">name</span><span class="Operator">*</span><span class="Other">:</span> <a href="system.html#cstring"><span class="Identifier">cstring</span></a></pre></dt>
  134. <dd>
  135. <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error</a>
  136. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/js/asyncjs.nim#L195" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  137. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/js/asyncjs.nim#L195" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  138. </dd>
  139. </div>
  140. <div id="Future">
  141. <dt><pre><a href="asyncjs.html#Future"><span class="Identifier">Future</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span> <span class="Other">=</span> <span class="Keyword">ref</span> <span class="Keyword">object</span>
  142. <span class="Identifier">future</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">T</span></pre></dt>
  143. <dd>
  144. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/js/asyncjs.nim#L75" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  145. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/js/asyncjs.nim#L75" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  146. </dd>
  147. </div>
  148. <div id="OnReject">
  149. <dt><pre><a href="asyncjs.html#OnReject"><span class="Identifier">OnReject</span></a> <span class="Other">=</span> <span class="Keyword">proc</span> <span class="Other">(</span><span class="Identifier">reason</span><span class="Other">:</span> <a href="asyncjs.html#Error"><span class="Identifier">Error</span></a><span class="Other">)</span></pre></dt>
  150. <dd>
  151. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/js/asyncjs.nim#L200" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  152. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/js/asyncjs.nim#L200" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  153. </dd>
  154. </div>
  155. <div id="PromiseJs">
  156. <dt><pre><a href="asyncjs.html#PromiseJs"><span class="Identifier">PromiseJs</span></a> {.<span class="Identifier">importjs</span><span class="Other">:</span> <span class="StringLit">&quot;Promise&quot;</span>.} <span class="Other">=</span> <span class="Keyword">ref</span> <span class="Keyword">object</span></pre></dt>
  157. <dd>
  158. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/js/asyncjs.nim#L79" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  159. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/js/asyncjs.nim#L79" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  160. </dd>
  161. </div>
  162. </dl>
  163. </div>
  164. <div class="section" id="12">
  165. <h1><a class="toc-backref" href="#12">Procs</a></h1>
  166. <dl class="item">
  167. <div id="catch-procs-all">
  168. <div id="catch,Future[T],OnReject">
  169. <dt><pre><span class="Keyword">proc</span> <a href="#catch%2CFuture%5BT%5D%2COnReject"><span class="Identifier">catch</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">(</span><span class="Identifier">future</span><span class="Other">:</span> <a href="asyncjs.html#Future"><span class="Identifier">Future</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">;</span> <span class="Identifier">onReject</span><span class="Other">:</span> <a href="asyncjs.html#OnReject"><span class="Identifier">OnReject</span></a><span class="Other">)</span><span class="Other">:</span> <a href="asyncjs.html#Future"><span class="Identifier">Future</span></a><span class="Other">[</span><a href="system.html#void"><span class="Identifier">void</span></a><span class="Other">]</span></pre></dt>
  170. <dd>
  171. See <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch</a>
  172. <p><strong class="examples_text">Example: cmd: -r:off</strong></p>
  173. <pre class="listing"><span class="Keyword">from</span> <span class="Identifier">std</span><span class="Operator">/</span><span class="Identifier">sugar</span> <span class="Keyword">import</span> <span class="Punctuation">`</span><span class="Operator">=&gt;</span><span class="Punctuation">`</span>
  174. <span class="Keyword">from</span> <span class="Identifier">std</span><span class="Operator">/</span><span class="Identifier">strutils</span> <span class="Keyword">import</span> <span class="Identifier">contains</span>
  175. <span class="Keyword">proc</span> <span class="Identifier">fn</span><span class="Punctuation">(</span><span class="Identifier">n</span><span class="Punctuation">:</span> <span class="Identifier">int</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">Future</span><span class="Punctuation">[</span><span class="Identifier">int</span><span class="Punctuation">]</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">async</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Operator">=</span>
  176. <span class="Keyword">if</span> <span class="Identifier">n</span> <span class="Operator">&gt;=</span> <span class="DecNumber">7</span><span class="Punctuation">:</span> <span class="Keyword">raise</span> <span class="Identifier">newException</span><span class="Punctuation">(</span><span class="Identifier">ValueError</span><span class="Punctuation">,</span> <span class="StringLit">&quot;foobar: &quot;</span> <span class="Operator">&amp;</span> <span class="Operator">$</span><span class="Identifier">n</span><span class="Punctuation">)</span>
  177. <span class="Keyword">else</span><span class="Punctuation">:</span> <span class="Identifier">result</span> <span class="Operator">=</span> <span class="Identifier">n</span> <span class="Operator">*</span> <span class="DecNumber">2</span>
  178. <span class="Keyword">proc</span> <span class="Identifier">main</span><span class="Punctuation">(</span><span class="Punctuation">)</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">async</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Operator">=</span>
  179. <span class="Keyword">var</span> <span class="Identifier">reason</span><span class="Punctuation">:</span> <span class="Identifier">Error</span>
  180. <span class="Identifier">await</span> <span class="Identifier">fn</span><span class="Punctuation">(</span><span class="DecNumber">6</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Identifier">catch</span><span class="Punctuation">(</span><span class="Punctuation">(</span><span class="Identifier">r</span><span class="Punctuation">:</span> <span class="Identifier">Error</span><span class="Punctuation">)</span> <span class="Operator">=&gt;</span> <span class="Punctuation">(</span><span class="Identifier">reason</span> <span class="Operator">=</span> <span class="Identifier">r</span><span class="Punctuation">)</span><span class="Punctuation">)</span> <span class="Comment"># note: `()` are needed, `=&gt; reason = r` would not work</span>
  181. <span class="Identifier">assert</span> <span class="Identifier">reason</span> <span class="Operator">==</span> <span class="Keyword">nil</span>
  182. <span class="Identifier">await</span> <span class="Identifier">fn</span><span class="Punctuation">(</span><span class="DecNumber">7</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Identifier">catch</span><span class="Punctuation">(</span><span class="Punctuation">(</span><span class="Identifier">r</span><span class="Punctuation">:</span> <span class="Identifier">Error</span><span class="Punctuation">)</span> <span class="Operator">=&gt;</span> <span class="Punctuation">(</span><span class="Identifier">reason</span> <span class="Operator">=</span> <span class="Identifier">r</span><span class="Punctuation">)</span><span class="Punctuation">)</span>
  183. <span class="Identifier">assert</span> <span class="Identifier">reason</span> <span class="Operator">!=</span> <span class="Keyword">nil</span>
  184. <span class="Identifier">assert</span> <span class="StringLit">&quot;foobar: 7&quot;</span> <span class="Keyword">in</span> <span class="Operator">$</span><span class="Identifier">reason</span><span class="Operator">.</span><span class="Identifier">message</span>
  185. <span class="Keyword">discard</span> <span class="Identifier">main</span><span class="Punctuation">(</span><span class="Punctuation">)</span></pre>
  186. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/js/asyncjs.nim#L249" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  187. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/js/asyncjs.nim#L249" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  188. </dd>
  189. </div>
  190. </div>
  191. <div id="newPromise-procs-all">
  192. <div id="newPromise,proc(proc))">
  193. <dt><pre><span class="Keyword">proc</span> <a href="#newPromise%2Cproc%28proc%29%29"><span class="Identifier">newPromise</span></a><span class="Other">(</span><span class="Identifier">handler</span><span class="Other">:</span> <span class="Keyword">proc</span> <span class="Other">(</span><span class="Identifier">resolve</span><span class="Other">:</span> <span class="Keyword">proc</span> <span class="Other">(</span><span class="Other">)</span><span class="Other">)</span><span class="Other">)</span><span class="Other">:</span> <a href="asyncjs.html#Future"><span class="Identifier">Future</span></a><span class="Other">[</span><a href="system.html#void"><span class="Identifier">void</span></a><span class="Other">]</span> {.
  194. <span class="Identifier">importjs</span><span class="Other">:</span> <span class="StringLit">&quot;(new Promise(#))&quot;</span><span class="Other">,</span> <span><span class="Other pragmadots">...</span></span><span class="pragmawrap"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">forbids</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span>.}</pre></dt>
  195. <dd>
  196. A helper for wrapping callback-based functions into promises and async procedures.
  197. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/js/asyncjs.nim#L173" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  198. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/js/asyncjs.nim#L173" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  199. </dd>
  200. </div>
  201. <div id="newPromise,proc(proc(T))">
  202. <dt><pre><span class="Keyword">proc</span> <a href="#newPromise%2Cproc%28proc%28T%29%29"><span class="Identifier">newPromise</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">(</span><span class="Identifier">handler</span><span class="Other">:</span> <span class="Keyword">proc</span> <span class="Other">(</span><span class="Identifier">resolve</span><span class="Other">:</span> <span class="Keyword">proc</span> <span class="Other">(</span><span class="Identifier">response</span><span class="Other">:</span> <span class="Identifier">T</span><span class="Other">)</span><span class="Other">)</span><span class="Other">)</span><span class="Other">:</span> <a href="asyncjs.html#Future"><span class="Identifier">Future</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span> {.
  203. <span class="Identifier">importjs</span><span class="Other">:</span> <span class="StringLit">&quot;(new Promise(#))&quot;</span><span class="Other">,</span> <span><span class="Other pragmadots">...</span></span><span class="pragmawrap"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">forbids</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span>.}</pre></dt>
  204. <dd>
  205. A helper for wrapping callback-based functions into promises and async procedures.
  206. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/js/asyncjs.nim#L169" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  207. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/js/asyncjs.nim#L169" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  208. </dd>
  209. </div>
  210. </div>
  211. <div id="then-procs-all">
  212. <div id="then,Future[T],proc,OnReject">
  213. <dt><pre><span class="Keyword">proc</span> <a href="#then%2CFuture%5BT%5D%2Cproc%2COnReject"><span class="Identifier">then</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">(</span><span class="Identifier">future</span><span class="Other">:</span> <a href="asyncjs.html#Future"><span class="Identifier">Future</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">;</span> <span class="Identifier">onSuccess</span><span class="Other">:</span> <span class="Keyword">proc</span><span class="Other">;</span> <span class="Identifier">onReject</span><span class="Other">:</span> <a href="asyncjs.html#OnReject"><span class="Identifier">OnReject</span></a> <span class="Other">=</span> <span class="Keyword">nil</span><span class="Other">)</span><span class="Other">:</span> <a href="system.html#auto"><span class="Identifier">auto</span></a></pre></dt>
  214. <dd>
  215. See <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then</a> Returns a <tt class="docutils literal"><span class="pre"><span class="Identifier">Future</span></span></tt> from the return type of <tt class="docutils literal"><span class="pre"><span class="Identifier">onSuccess</span><span class="Punctuation">(</span><span class="Identifier">T</span><span class="Operator">.</span><span class="Identifier">default</span><span class="Punctuation">)</span></span></tt>.
  216. <p><strong class="examples_text">Example: cmd: -r:off</strong></p>
  217. <pre class="listing"><span class="Keyword">from</span> <span class="Identifier">std</span><span class="Operator">/</span><span class="Identifier">sugar</span> <span class="Keyword">import</span> <span class="Punctuation">`</span><span class="Operator">=&gt;</span><span class="Punctuation">`</span>
  218. <span class="Keyword">proc</span> <span class="Identifier">fn</span><span class="Punctuation">(</span><span class="Identifier">n</span><span class="Punctuation">:</span> <span class="Identifier">int</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">Future</span><span class="Punctuation">[</span><span class="Identifier">int</span><span class="Punctuation">]</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">async</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Operator">=</span>
  219. <span class="Keyword">if</span> <span class="Identifier">n</span> <span class="Operator">&gt;=</span> <span class="DecNumber">7</span><span class="Punctuation">:</span> <span class="Keyword">raise</span> <span class="Identifier">newException</span><span class="Punctuation">(</span><span class="Identifier">ValueError</span><span class="Punctuation">,</span> <span class="StringLit">&quot;foobar: &quot;</span> <span class="Operator">&amp;</span> <span class="Operator">$</span><span class="Identifier">n</span><span class="Punctuation">)</span>
  220. <span class="Keyword">else</span><span class="Punctuation">:</span> <span class="Identifier">result</span> <span class="Operator">=</span> <span class="Identifier">n</span> <span class="Operator">*</span> <span class="DecNumber">2</span>
  221. <span class="Keyword">proc</span> <span class="Identifier">asyncFact</span><span class="Punctuation">(</span><span class="Identifier">n</span><span class="Punctuation">:</span> <span class="Identifier">int</span><span class="Punctuation">)</span><span class="Punctuation">:</span> <span class="Identifier">Future</span><span class="Punctuation">[</span><span class="Identifier">int</span><span class="Punctuation">]</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">async</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Operator">=</span>
  222. <span class="Keyword">if</span> <span class="Identifier">n</span> <span class="Operator">&gt;</span> <span class="DecNumber">0</span><span class="Punctuation">:</span> <span class="Identifier">result</span> <span class="Operator">=</span> <span class="Identifier">n</span> <span class="Operator">*</span> <span class="Identifier">await</span> <span class="Identifier">asyncFact</span><span class="Punctuation">(</span><span class="Identifier">n</span><span class="Operator">-</span><span class="DecNumber">1</span><span class="Punctuation">)</span>
  223. <span class="Keyword">else</span><span class="Punctuation">:</span> <span class="Identifier">result</span> <span class="Operator">=</span> <span class="DecNumber">1</span>
  224. <span class="Keyword">proc</span> <span class="Identifier">main</span><span class="Punctuation">(</span><span class="Punctuation">)</span> <span class="Punctuation">{</span><span class="Operator">.</span><span class="Identifier">async</span><span class="Operator">.</span><span class="Punctuation">}</span> <span class="Operator">=</span>
  225. <span class="Keyword">block</span><span class="Punctuation">:</span> <span class="Comment"># then</span>
  226. <span class="Identifier">assert</span> <span class="Identifier">asyncFact</span><span class="Punctuation">(</span><span class="DecNumber">3</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Identifier">await</span> <span class="Operator">==</span> <span class="DecNumber">3</span><span class="Operator">*</span><span class="DecNumber">2</span>
  227. <span class="Identifier">assert</span> <span class="Identifier">asyncFact</span><span class="Punctuation">(</span><span class="DecNumber">3</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Identifier">then</span><span class="Punctuation">(</span><span class="Identifier">asyncFact</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Identifier">await</span> <span class="Operator">==</span> <span class="DecNumber">6</span><span class="Operator">*</span><span class="DecNumber">5</span><span class="Operator">*</span><span class="DecNumber">4</span><span class="Operator">*</span><span class="DecNumber">3</span><span class="Operator">*</span><span class="DecNumber">2</span>
  228. <span class="Keyword">let</span> <span class="Identifier">x1</span> <span class="Operator">=</span> <span class="Identifier">await</span> <span class="Identifier">fn</span><span class="Punctuation">(</span><span class="DecNumber">3</span><span class="Punctuation">)</span>
  229. <span class="Identifier">assert</span> <span class="Identifier">x1</span> <span class="Operator">==</span> <span class="DecNumber">3</span> <span class="Operator">*</span> <span class="DecNumber">2</span>
  230. <span class="Keyword">let</span> <span class="Identifier">x2</span> <span class="Operator">=</span> <span class="Identifier">await</span> <span class="Identifier">fn</span><span class="Punctuation">(</span><span class="DecNumber">4</span><span class="Punctuation">)</span>
  231. <span class="Operator">.</span><span class="Identifier">then</span><span class="Punctuation">(</span><span class="Punctuation">(</span><span class="Identifier">a</span><span class="Punctuation">:</span> <span class="Identifier">int</span><span class="Punctuation">)</span> <span class="Operator">=&gt;</span> <span class="Identifier">a</span><span class="Operator">.</span><span class="Identifier">float</span><span class="Punctuation">)</span>
  232. <span class="Operator">.</span><span class="Identifier">then</span><span class="Punctuation">(</span><span class="Punctuation">(</span><span class="Identifier">a</span><span class="Punctuation">:</span> <span class="Identifier">float</span><span class="Punctuation">)</span> <span class="Operator">=&gt;</span> <span class="Operator">$</span><span class="Identifier">a</span><span class="Punctuation">)</span>
  233. <span class="Identifier">assert</span> <span class="Identifier">x2</span> <span class="Operator">==</span> <span class="StringLit">&quot;8.0&quot;</span>
  234. <span class="Keyword">block</span><span class="Punctuation">:</span> <span class="Comment"># then with `onReject` callback</span>
  235. <span class="Keyword">var</span> <span class="Identifier">witness</span> <span class="Operator">=</span> <span class="DecNumber">1</span>
  236. <span class="Identifier">await</span> <span class="Identifier">fn</span><span class="Punctuation">(</span><span class="DecNumber">6</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Identifier">then</span><span class="Punctuation">(</span><span class="Punctuation">(</span><span class="Identifier">a</span><span class="Punctuation">:</span> <span class="Identifier">int</span><span class="Punctuation">)</span> <span class="Operator">=&gt;</span> <span class="Punctuation">(</span><span class="Identifier">witness</span> <span class="Operator">=</span> <span class="DecNumber">2</span><span class="Punctuation">)</span><span class="Punctuation">,</span> <span class="Punctuation">(</span><span class="Identifier">r</span><span class="Punctuation">:</span> <span class="Identifier">Error</span><span class="Punctuation">)</span> <span class="Operator">=&gt;</span> <span class="Punctuation">(</span><span class="Identifier">witness</span> <span class="Operator">=</span> <span class="DecNumber">3</span><span class="Punctuation">)</span><span class="Punctuation">)</span>
  237. <span class="Identifier">assert</span> <span class="Identifier">witness</span> <span class="Operator">==</span> <span class="DecNumber">2</span>
  238. <span class="Identifier">await</span> <span class="Identifier">fn</span><span class="Punctuation">(</span><span class="DecNumber">7</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Identifier">then</span><span class="Punctuation">(</span><span class="Punctuation">(</span><span class="Identifier">a</span><span class="Punctuation">:</span> <span class="Identifier">int</span><span class="Punctuation">)</span> <span class="Operator">=&gt;</span> <span class="Punctuation">(</span><span class="Identifier">witness</span> <span class="Operator">=</span> <span class="DecNumber">2</span><span class="Punctuation">)</span><span class="Punctuation">,</span> <span class="Punctuation">(</span><span class="Identifier">r</span><span class="Punctuation">:</span> <span class="Identifier">Error</span><span class="Punctuation">)</span> <span class="Operator">=&gt;</span> <span class="Punctuation">(</span><span class="Identifier">witness</span> <span class="Operator">=</span> <span class="DecNumber">3</span><span class="Punctuation">)</span><span class="Punctuation">)</span>
  239. <span class="Identifier">assert</span> <span class="Identifier">witness</span> <span class="Operator">==</span> <span class="DecNumber">3</span></pre>
  240. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/js/asyncjs.nim#L202" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  241. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/js/asyncjs.nim#L202" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  242. </dd>
  243. </div>
  244. </div>
  245. </dl>
  246. </div>
  247. <div class="section" id="17">
  248. <h1><a class="toc-backref" href="#17">Macros</a></h1>
  249. <dl class="item">
  250. <div id="async-macros-all">
  251. <div id="async.m,untyped">
  252. <dt><pre><span class="Keyword">macro</span> <a href="#async.m%2Cuntyped"><span class="Identifier">async</span></a><span class="Other">(</span><span class="Identifier">arg</span><span class="Other">:</span> <a href="system.html#untyped"><span class="Identifier">untyped</span></a><span class="Other">)</span><span class="Other">:</span> <a href="system.html#untyped"><span class="Identifier">untyped</span></a></pre></dt>
  253. <dd>
  254. Macro which converts normal procedures into javascript-compatible async procedures.
  255. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/js/asyncjs.nim#L159" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  256. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/js/asyncjs.nim#L159" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  257. </dd>
  258. </div>
  259. </div>
  260. </dl>
  261. </div>
  262. </div>
  263. </div>
  264. <div class="twelve-columns footer">
  265. <span class="nim-sprite"></span>
  266. <br>
  267. <small style="color: var(--hint);">Made with Nim. Generated: 2025-02-06 22:28:36 UTC</small>
  268. </div>
  269. </div>
  270. </div>
  271. <script defer data-domain="nim-lang.org" src="https://plausible.io/js/plausible.js"></script>
  272. </body>
  273. </html>