lib/graphql/batch/loader.rb in graphql-batch-0.2.5 vs lib/graphql/batch/loader.rb in graphql-batch-0.3.0
- old
+ new
@@ -1,11 +1,13 @@
module GraphQL::Batch
class Loader
def self.for(*group_args)
loader_key = [self].concat(group_args)
- Executor.current.loaders[loader_key] ||= new(*group_args).tap do |loader|
+ executor = Executor.current
+ executor.loaders[loader_key] ||= new(*group_args).tap do |loader|
loader.loader_key = loader_key
+ loader.executor = executor
end
end
def self.load(key)
self.for.load(key)
@@ -13,25 +15,21 @@
def self.load_many(keys)
self.for.load_many(keys)
end
- attr_accessor :loader_key
+ attr_accessor :loader_key, :executor
def load(key)
- loader = Executor.current.loaders[loader_key] ||= self
- if loader != self
- raise "load called on loader that wasn't registered with executor"
- end
cache[cache_key(key)] ||= begin
queue << key
- Promise.new
+ Promise.new.tap { |promise| promise.source = self }
end
end
def load_many(keys)
- Promise.all(keys.map { |key| load(key) })
+ ::Promise.all(keys.map { |key| load(key) })
end
def resolve #:nodoc:
load_keys = queue
return if load_keys.empty?
@@ -42,10 +40,20 @@
each_pending_promise(load_keys) do |key, promise|
promise.reject(err)
end
end
+ # For Promise#sync
+ def wait #:nodoc:
+ if executor
+ executor.loaders.delete(loader_key)
+ executor.resolve(self)
+ else
+ resolve
+ end
+ end
+
protected
# Fulfill the key with provided value, for use in #perform
def fulfill(key, value)
promise_for(key).fulfill(value)
@@ -89,10 +97,10 @@
end
end
def check_for_broken_promises(load_keys)
each_pending_promise(load_keys) do |key, promise|
- promise.reject(BrokenPromiseError.new("#{self.class} didn't fulfill promise for key #{key.inspect}"))
+ promise.reject(::Promise::BrokenError.new("#{self.class} didn't fulfill promise for key #{key.inspect}"))
end
end
end
end