lib/graphql/batch/loader.rb in graphql-batch-0.3.5 vs lib/graphql/batch/loader.rb in graphql-batch-0.3.7
- old
+ new
@@ -10,14 +10,11 @@
raise NoExecutorError, "Cannot create loader without an Executor."\
" Wrap the call to `for` with `GraphQL::Batch.batch` or use"\
" `GraphQL::Batch::Setup` as a query instrumenter if using with `graphql-ruby`"
end
- executor.loaders[loader_key] ||= new(*group_args).tap do |loader|
- loader.loader_key = loader_key
- loader.executor = executor
- end
+ executor.loader(loader_key) { new(*group_args) }
end
def self.loader_key_for(*group_args)
[self].concat(group_args)
end
@@ -33,11 +30,11 @@
attr_accessor :loader_key, :executor
def load(key)
cache[cache_key(key)] ||= begin
queue << key
- Promise.new.tap { |promise| promise.source = self }
+ ::Promise.new.tap { |promise| promise.source = self }
end
end
def load_many(keys)
::Promise.all(keys.map { |key| load(key) })
@@ -48,13 +45,11 @@
load_keys = queue
@queue = nil
perform(load_keys)
check_for_broken_promises(load_keys)
rescue => err
- each_pending_promise(load_keys) do |key, promise|
- promise.reject(err)
- end
+ reject_pending_promises
end
# For Promise#sync
def wait #:nodoc:
if executor
@@ -70,13 +65,21 @@
protected
# Fulfill the key with provided value, for use in #perform
def fulfill(key, value)
- promise_for(key).fulfill(value)
+ finish_resolve(key) do |promise|
+ promise.fulfill(value)
+ end
end
+ def reject(key, reason)
+ finish_resolve(key) do |promise|
+ promise.reject(reason)
+ end
+ end
+
# Returns true when the key has already been fulfilled, otherwise returns false
def fulfilled?(key)
promise_for(key).fulfilled?
end
@@ -90,10 +93,18 @@
load_key
end
private
+ def finish_resolve(key)
+ promise = promise_for(key)
+ return yield(promise) unless executor
+ executor.around_promise_callbacks do
+ yield promise
+ end
+ end
+
def cache
@cache ||= {}
end
def queue
@@ -102,21 +113,19 @@
def promise_for(load_key)
cache.fetch(cache_key(load_key))
end
- def each_pending_promise(load_keys)
+ def reject_pending_promises
load_keys.each do |key|
- promise = promise_for(key)
- if promise.pending?
- yield key, promise
- end
+ # promise.rb ignores reject if promise isn't pending
+ reject(key, err)
end
end
def check_for_broken_promises(load_keys)
- each_pending_promise(load_keys) do |key, promise|
- promise.reject(::Promise::BrokenError.new("#{self.class} didn't fulfill promise for key #{key.inspect}"))
+ load_keys.each do |key|
+ reject(key, ::Promise::BrokenError.new("#{self.class} didn't fulfill promise for key #{key.inspect}"))
end
end
end
end