Update.
This commit is contained in:
@@ -42,27 +42,38 @@
|
||||
<li><a href="../api/index.html">Overview</a></li>
|
||||
<li><a href="../api/string.html">String</a></li>
|
||||
<li><a href="../api/number.html">Num</a></li>
|
||||
<li><a href="../api/http.html">http</a></li>
|
||||
<li><a href="../api/websocket.html">websocket</a></li>
|
||||
<li><a href="../api/tls.html">tls</a></li>
|
||||
<li><a href="../api/net.html">net</a></li>
|
||||
<li><a href="../api/dns.html">dns</a></li>
|
||||
<li><a href="../api/json.html">json</a></li>
|
||||
<li><a href="../api/argparse.html">argparse</a></li>
|
||||
<li><a href="../api/base64.html">base64</a></li>
|
||||
<li><a href="../api/regex.html">regex</a></li>
|
||||
<li><a href="../api/jinja.html">jinja</a></li>
|
||||
<li><a href="../api/crypto.html">crypto</a></li>
|
||||
<li><a href="../api/os.html">os</a></li>
|
||||
<li><a href="../api/env.html">env</a></li>
|
||||
<li><a href="../api/signal.html">signal</a></li>
|
||||
<li><a href="../api/subprocess.html">subprocess</a></li>
|
||||
<li><a href="../api/sqlite.html">sqlite</a></li>
|
||||
<li><a href="../api/dataset.html">dataset</a></li>
|
||||
<li><a href="../api/datetime.html">datetime</a></li>
|
||||
<li><a href="../api/timer.html">timer</a></li>
|
||||
<li><a href="../api/dns.html">dns</a></li>
|
||||
<li><a href="../api/env.html">env</a></li>
|
||||
<li><a href="../api/fswatch.html">fswatch</a></li>
|
||||
<li><a href="../api/html.html">html</a></li>
|
||||
<li><a href="../api/http.html">http</a></li>
|
||||
<li><a href="../api/io.html">io</a></li>
|
||||
<li><a href="../api/pathlib.html">pathlib</a></li>
|
||||
<li><a href="../api/scheduler.html">scheduler</a></li>
|
||||
<li><a href="../api/jinja.html">jinja</a></li>
|
||||
<li><a href="../api/json.html">json</a></li>
|
||||
<li><a href="../api/markdown.html">markdown</a></li>
|
||||
<li><a href="../api/math.html">math</a></li>
|
||||
<li><a href="../api/net.html">net</a></li>
|
||||
<li><a href="../api/os.html">os</a></li>
|
||||
<li><a href="../api/pathlib.html">pathlib</a></li>
|
||||
<li><a href="../api/regex.html">regex</a></li>
|
||||
<li><a href="../api/scheduler.html">scheduler</a></li>
|
||||
<li><a href="../api/signal.html">signal</a></li>
|
||||
<li><a href="../api/sqlite.html">sqlite</a></li>
|
||||
<li><a href="../api/subprocess.html">subprocess</a></li>
|
||||
<li><a href="../api/sysinfo.html">sysinfo</a></li>
|
||||
<li><a href="../api/tempfile.html">tempfile</a></li>
|
||||
<li><a href="../api/timer.html">timer</a></li>
|
||||
<li><a href="../api/tls.html">tls</a></li>
|
||||
<li><a href="../api/udp.html">udp</a></li>
|
||||
<li><a href="../api/uuid.html">uuid</a></li>
|
||||
<li><a href="../api/wdantic.html">wdantic</a></li>
|
||||
<li><a href="../api/web.html">web</a></li>
|
||||
<li><a href="../api/websocket.html">websocket</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section">
|
||||
@@ -72,14 +83,34 @@
|
||||
<li><a href="http-client.html" class="active">HTTP Client</a></li>
|
||||
<li><a href="websocket-chat.html">WebSocket Chat</a></li>
|
||||
<li><a href="database-app.html">Database App</a></li>
|
||||
<li><a href="template-rendering.html">Template Rendering</a></li>
|
||||
<li><a href="template-rendering.html">Templates</a></li>
|
||||
<li><a href="cli-tool.html">CLI Tool</a></li>
|
||||
<li><a href="web-server.html">Web Server</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section">
|
||||
<span class="section-title">How-To Guides</span>
|
||||
<ul>
|
||||
<li><a href="../howto/index.html">How-To List</a></li>
|
||||
<li><a href="../howto/http-requests.html">HTTP Requests</a></li>
|
||||
<li><a href="../howto/json-parsing.html">JSON Parsing</a></li>
|
||||
<li><a href="../howto/regex-patterns.html">Regex Patterns</a></li>
|
||||
<li><a href="../howto/file-operations.html">File Operations</a></li>
|
||||
<li><a href="../howto/async-operations.html">Async Operations</a></li>
|
||||
<li><a href="../howto/error-handling.html">Error Handling</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section">
|
||||
<span class="section-title">Contributing</span>
|
||||
<ul>
|
||||
<li><a href="../contributing/index.html">Overview</a></li>
|
||||
<li><a href="../contributing/module-overview.html">Module Architecture</a></li>
|
||||
<li><a href="../contributing/pure-wren-module.html">Pure-Wren Modules</a></li>
|
||||
<li><a href="../contributing/c-backed-module.html">C-Backed Modules</a></li>
|
||||
<li><a href="../contributing/foreign-classes.html">Foreign Classes</a></li>
|
||||
<li><a href="../contributing/async-patterns.html">Async Patterns</a></li>
|
||||
<li><a href="../contributing/testing.html">Writing Tests</a></li>
|
||||
<li><a href="../contributing/documentation.html">Documentation</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
@@ -398,6 +429,92 @@ if (result["error"]) {
|
||||
System.print("Success: %(result["data"]["title"])")
|
||||
}</code></pre>
|
||||
|
||||
<h2>Step 9: Concurrent HTTP Requests</h2>
|
||||
|
||||
<p>When you need to fetch data from multiple endpoints, sequential requests can be slow. Use <code>async</code> and <code>await</code> to run requests concurrently:</p>
|
||||
|
||||
<pre><code>import "http" for Http
|
||||
import "scheduler" for Scheduler, Future
|
||||
import "json" for Json
|
||||
|
||||
var fetchJson = async { |url|
|
||||
var response = Http.get(url)
|
||||
return response.json
|
||||
}
|
||||
|
||||
// SEQUENTIAL: Each request waits for the previous one
|
||||
System.print("--- Sequential requests ---")
|
||||
var user = await fetchJson("https://jsonplaceholder.typicode.com/users/1")
|
||||
var posts = await fetchJson("https://jsonplaceholder.typicode.com/posts?userId=1")
|
||||
var todos = await fetchJson("https://jsonplaceholder.typicode.com/todos?userId=1")
|
||||
|
||||
System.print("User: %(user["name"])")
|
||||
System.print("Posts: %(posts.count)")
|
||||
System.print("Todos: %(todos.count)")</code></pre>
|
||||
|
||||
<p>For concurrent execution, use <code>.call()</code> to start requests without waiting, then <code>await</code> the results:</p>
|
||||
|
||||
<pre><code>import "http" for Http
|
||||
import "scheduler" for Scheduler, Future
|
||||
import "json" for Json
|
||||
|
||||
var fetchJson = async { |url|
|
||||
var response = Http.get(url)
|
||||
return response.json
|
||||
}
|
||||
|
||||
// CONCURRENT: All requests start at once
|
||||
System.print("--- Concurrent requests ---")
|
||||
var f1 = fetchJson.call("https://jsonplaceholder.typicode.com/users/1")
|
||||
var f2 = fetchJson.call("https://jsonplaceholder.typicode.com/posts?userId=1")
|
||||
var f3 = fetchJson.call("https://jsonplaceholder.typicode.com/todos?userId=1")
|
||||
|
||||
// Wait for results (requests run in parallel)
|
||||
var user = await f1
|
||||
var posts = await f2
|
||||
var todos = await f3
|
||||
|
||||
System.print("User: %(user["name"])")
|
||||
System.print("Posts: %(posts.count)")
|
||||
System.print("Todos: %(todos.count)")</code></pre>
|
||||
|
||||
<h3>Batch Fetching with Concurrent Requests</h3>
|
||||
|
||||
<p>For fetching multiple URLs dynamically, create futures in a loop:</p>
|
||||
|
||||
<pre><code>import "http" for Http
|
||||
import "scheduler" for Scheduler, Future
|
||||
import "json" for Json
|
||||
|
||||
var fetchJson = async { |url|
|
||||
var response = Http.get(url)
|
||||
return response.json
|
||||
}
|
||||
|
||||
var userIds = [1, 2, 3, 4, 5]
|
||||
|
||||
// Start all requests concurrently
|
||||
var futures = []
|
||||
for (id in userIds) {
|
||||
futures.add(fetchJson.call("https://jsonplaceholder.typicode.com/users/%(id)"))
|
||||
}
|
||||
|
||||
// Collect results
|
||||
var users = []
|
||||
for (f in futures) {
|
||||
users.add(await f)
|
||||
}
|
||||
|
||||
System.print("Fetched %(users.count) users:")
|
||||
for (user in users) {
|
||||
System.print(" - %(user["name"]) (%(user["email"]))")
|
||||
}</code></pre>
|
||||
|
||||
<div class="admonition tip">
|
||||
<div class="admonition-title">Direct Calling vs .call()</div>
|
||||
<p>Use <code>await fn(args)</code> for sequential execution (waits immediately). Use <code>fn.call(args)</code> to start without waiting, enabling concurrent execution.</p>
|
||||
</div>
|
||||
|
||||
<h2>Complete Example</h2>
|
||||
|
||||
<p>Here is a complete, production-ready API client:</p>
|
||||
|
||||
Reference in New Issue
Block a user