相当于Python Tornado中的jquery $ .when

时间:2014-09-25 17:32:02

标签: javascript jquery python tornado

在jQuery $.when(promise1, promise2...)中用作主承诺来表示其子承诺的总体状态。然后,我们可以将.done(callback)附加到$.when承诺,这样当所有promise1, promise2...完成后,callback将被执行。

在Python(Tornado)中,Future的行为类似于javascript中的承诺,而fetch()中的AsyncHTTPClient会返回Future。

在下面的代码中,我有一个期货清单

from tornado.httpclient import AsyncHTTPClient

httpclient = AsyncHTTPClient()
futures = [
    httpclient.fetch("http://google.com")
    httpclient.fetch("http://example.com")
    httpclient.fetch("http://example.org")
]

def all_futures_done_callback():
    ...

当所有期货结束时,如何执行all_futures_done_callback

2 个答案:

答案 0 :(得分:2)

在协程中,很容易等待多个期货;只需将它们全部作为列表:

@gen.coroutine
def f():
    futures = [
        httpclient.fetch("http://google.com")
        httpclient.fetch("http://example.com")
        httpclient.fetch("http://example.org")
    ]
    responses = yield futures

要使用回调而不是协同程序执行此操作,您需要像mgilson的答案。

答案 1 :(得分:1)

在我看来,您需要自己构建此功能。这是未经测试的,但这样的事情似乎应该有效:

class FutureCollection(Future):
    def __init__(self, *args, **kwargs):
        super(FutureCollection, self).__init__(*args, **kwargs)
        self._waiting_for = []

    def _check_all_done_and_resolve(self, future):
        if all(f.done() for f in self._waiting_for):
            # Maybe check for exceptions a. la.
            # http://tornado.readthedocs.org/en/latest/_modules/tornado/concurrent.html#chain_future
            self.set_result(None)  # Not sure what the result should be.

    def add_future(self, future):
        self._waiting_for.append(future)
        future.add_done_callback(self._check_all_done_and_resolve)

    @property
    def futures(self):
        # Read-only access to the futures that have been added.
        return iter(self._waiting_for)