diff --git a/graphene/relay/connection.py b/graphene/relay/connection.py index 339e4266..1e1628b4 100644 --- a/graphene/relay/connection.py +++ b/graphene/relay/connection.py @@ -12,6 +12,7 @@ from ..types import (AbstractType, Boolean, Enum, Int, Interface, List, NonNull, from ..types.field import Field from ..types.objecttype import ObjectType, ObjectTypeMeta from ..types.options import Options +from ..utils.compat_asyncio_promise import promisify from ..utils.is_base_type import is_base_type from ..utils.props import props from .node import is_node @@ -139,7 +140,7 @@ class IterableConnectionField(Field): @classmethod def connection_resolver(cls, resolver, connection_type, root, args, context, info): - resolved = resolver(root, args, context, info) + resolved = promisify(resolver(root, args, context, info)) on_resolve = partial(cls.resolve_connection, connection_type, args) if isinstance(resolved, Promise): diff --git a/graphene/utils/compat_asyncio_promise.py b/graphene/utils/compat_asyncio_promise.py new file mode 100644 index 00000000..1d9f31a7 --- /dev/null +++ b/graphene/utils/compat_asyncio_promise.py @@ -0,0 +1,12 @@ +import promise + +def promisify(resolved): + try: + import asyncio + if isinstance(resolved, asyncio.Future) or \ + asyncio.iscoroutine(resolved): + return promise.promisify(resolved) + except: + pass + + return resolved