Port of jQuery.Deferred to Ruby
Add this line to your application's Gemfile:
gem 'deferred-for-ruby'
And then execute:
bundle
Or install it yourself as:
gem install deferred-for-ruby
require 'deferred'
delay_hello = Proc.new do
d = Deferred.new
Thread.start do
sleep 1
puts :hello
d.resolve
end
d.promise
end
delay_error = Proc.new do
d = Deferred.new
Thread.start do
sleep 1
d.reject(:error!)
end
d.promise
end
hello1 = Proc.new { puts :hello1 }
hello2 = Proc.new { puts :hello2 }
delay_hello.call
.then(hello1, hello2)
# sleep 1 second...
# => hello
# => hello1
delay_error.call
.then(hello1, hello2)
# sleep 1 second...
# => hello2
promise1 = delay_hello.call
promise2 = promise1.then(hello1)
# sleep 1 second...
# => hello
# => hello1
promise1 == promise2 # => false
delay_error.call
.then(hello1)
# do nothing
delay_error.call
.then(hello1)
.fail { |error| puts error }
# sleep 1 second...
# => error!
delay_hello.call
.then(delay_hello)
.then(delay_hello)
.then(delay_hello)
# every 1 second say hello
delay_error.call
.then(hello1,
Proc.new { |error|
puts error
Deferred.new.resolve.promise
})
.then(hello1, hello2)
# sleep 1 second...
# => error!
# => hello1
delay_hello_parallel = Proc.new do
Deferred.when(delay_hello.call, delay_hello.call, delay_hello.call)
end
delay_hello.call
.then(delay_hello_parallel)
.then(delay_hello_parallel)
# sleep 1 second...
# => hello
# sleep 1 second...
# => hello
# => hello
# => hello
# sleep 1 second...
# => hello
# => hello
# => hello
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request
Copyright (c) 2013 Kazuya Takeshima. See LICENSE for details.