|
|
@@ -31,42 +31,6 @@ class Loader(DirectObject):
|
|
|
# This indicates that this class behaves like a Future.
|
|
|
_asyncio_future_blocking = False
|
|
|
|
|
|
- class _ResultAwaiter(object):
|
|
|
- """Reinvents generators because of PEP 479, sigh. See #513."""
|
|
|
-
|
|
|
- __slots__ = 'requestList', 'index'
|
|
|
-
|
|
|
- def __init__(self, requestList):
|
|
|
- self.requestList = requestList
|
|
|
- self.index = 0
|
|
|
-
|
|
|
- def __await__(self):
|
|
|
- return self
|
|
|
-
|
|
|
- def __anext__(self):
|
|
|
- if self.index >= len(self.requestList):
|
|
|
- raise StopAsyncIteration
|
|
|
- return self
|
|
|
-
|
|
|
- def __iter__(self):
|
|
|
- return self
|
|
|
-
|
|
|
- def __next__(self):
|
|
|
- i = self.index
|
|
|
- request = self.requestList[i]
|
|
|
- if not request.done():
|
|
|
- return request
|
|
|
-
|
|
|
- self.index = i + 1
|
|
|
-
|
|
|
- result = request.result()
|
|
|
- if isinstance(result, PandaNode):
|
|
|
- result = NodePath(result)
|
|
|
-
|
|
|
- exc = StopIteration(result)
|
|
|
- exc.value = result
|
|
|
- raise exc
|
|
|
-
|
|
|
def __init__(self, loader, numObjects, gotList, callback, extraArgs):
|
|
|
self._loader = loader
|
|
|
self.objects = [None] * numObjects
|
|
|
@@ -124,13 +88,15 @@ class Loader(DirectObject):
|
|
|
|
|
|
if self.requests:
|
|
|
self._asyncio_future_blocking = True
|
|
|
+ while self.requests:
|
|
|
+ yield self
|
|
|
|
|
|
if self.gotList:
|
|
|
- return self._ResultAwaiter([self])
|
|
|
+ return self.objects
|
|
|
else:
|
|
|
- return self._ResultAwaiter(self.requestList)
|
|
|
+ return self.objects[0]
|
|
|
|
|
|
- def __aiter__(self):
|
|
|
+ async def __aiter__(self):
|
|
|
""" This allows using `async for` to iterate asynchronously over
|
|
|
the results of this class. It does guarantee to return the
|
|
|
results in order, though, even though they may not be loaded in
|
|
|
@@ -138,7 +104,8 @@ class Loader(DirectObject):
|
|
|
requestList = self.requestList
|
|
|
assert requestList is not None, "Request was cancelled."
|
|
|
|
|
|
- return self._ResultAwaiter(requestList)
|
|
|
+ for req in requestList:
|
|
|
+ yield await req
|
|
|
|
|
|
# special methods
|
|
|
def __init__(self, base):
|