|
@@ -0,0 +1,53 @@
|
|
|
+//
|
|
|
+// The power and purpose of async/await becomes more apparent
|
|
|
+// when we do multiple things concurrently. Foo and Bar do not
|
|
|
+// depend on each other and can happen at the same time, but End
|
|
|
+// requires that they both be finished.
|
|
|
+//
|
|
|
+// +---------+
|
|
|
+// | Start |
|
|
|
+// +---------+
|
|
|
+// / \
|
|
|
+// / \
|
|
|
+// +---------+ +---------+
|
|
|
+// | Foo | | Bar |
|
|
|
+// +---------+ +---------+
|
|
|
+// \ /
|
|
|
+// \ /
|
|
|
+// +---------+
|
|
|
+// | End |
|
|
|
+// +---------+
|
|
|
+//
|
|
|
+// We can express this in Zig like so:
|
|
|
+//
|
|
|
+// fn foo() u32 { ... }
|
|
|
+// fn bar() u32 { ... }
|
|
|
+//
|
|
|
+// // Start
|
|
|
+//
|
|
|
+// var foo_frame = async foo();
|
|
|
+// var bar_frame = async bar();
|
|
|
+//
|
|
|
+// var foo_value = await foo_frame;
|
|
|
+// var bar_value = await bar_frame;
|
|
|
+//
|
|
|
+// // End
|
|
|
+//
|
|
|
+// Please await TWO page titles!
|
|
|
+//
|
|
|
+const print = @import("std").debug.print;
|
|
|
+
|
|
|
+pub fn main() void {
|
|
|
+ var com_frame = async getPageTitle("http://example.com");
|
|
|
+ var org_frame = async getPageTitle("http://example.org");
|
|
|
+
|
|
|
+ var com_title = com_frame;
|
|
|
+ var org_title = org_frame;
|
|
|
+
|
|
|
+ print(".com: {s}, .org: {s}.\n", .{com_title, org_title});
|
|
|
+}
|
|
|
+
|
|
|
+fn getPageTitle(url: []const u8) []const u8 {
|
|
|
+ // Please PRETEND this is actually making a network request.
|
|
|
+ return "Example Title";
|
|
|
+}
|