Method: JS::Object#await
- Defined in:
- lib/js.rb
#await ⇒ Object
Await a JavaScript Promise like ‘await` in JavaScript. This method looks like a synchronous method, but it actually runs asynchronously using fibers. In other words, the next line to the `await` call at Ruby source will be executed after the promise will be resolved. However, it does not block JavaScript event loop, so the next line to the RubyVM.evalAsync` (in the case when no `await` operator before the call expression) at JavaScript source will be executed without waiting for the promise.
The below example shows how the execution order goes. It goes in the order of “step N”
# In JavaScript
const response = vm.evalAsync(`
puts "step 1"
JS.global.fetch("https://example.com").await
puts "step 3"
`) // => Promise
console.log("step 2")
await response
console.log("step 4")
The below examples show typical usage in Ruby
JS.eval("return new Promise((ok) => setTimeout(() => ok(42), 1000))").await # => 42 (after 1 second)
JS.global.fetch("https://example.com").await # => [object Response]
JS.eval("return 42").await # => 42
JS.eval("return new Promise((ok, err) => err(new Error())").await # => raises JS::Error
246 247 248 249 250 |
# File 'lib/js.rb', line 246 def await # Promise.resolve wrap a value or flattens promise-like object and its thenable chain promise = ::JS.global[:Promise].resolve(self) ::JS.promise_scheduler.await(promise) end |