docs/promises
Promise
Promise
is a class available in the Opal stdlib for helping structure asynchronous code.
It can be required inside any Opal applicaton:
require 'promise'
Please also take a look at the Asynchronous code guide - we are in the process of modernizing the Promises, along with supporting async/await
Usage
This example shows how to use a HTTP
request from opal-jquery
from a callback style, into a promise style handler.
def get_json(url) promise = Promise.new HTTP.get(url) do |response| if response.ok? promise.resolve response.json else promise.reject response end end promise end get_json('/users/1.json').then do |json| puts "Got data: #{json}" end.fail do |res| alert "It didn't work :( #{res}" end
A promise can only be resolved or rejected once.
Chaining Promises
Promises become useful when chained together. The previous example could be extended to get another object from the result of the first request.
get_json('/users/1.json').then do |json| get_json("/posts/#{json[:post_id]}.json") end.then do |post| puts "got post: #{post}" end
Composing Promises
Promise.when
can be used to wait for more than 1 promise to resolve (or reject). Lets assume we wanted to get 2 different users:
first = get_json '/users/1.json' second = get_json '/users/2.json' Promise.when(first, second).then do |user1, user2| puts "got users: #{user1}, #{user2}" end.fail do alert "Something bad happened" end