【问题标题】:Why can't we call a Twisted deferred twice?为什么我们不能调用 Twisted deferred 两次?
【发布时间】:2014-05-13 18:56:00
【问题描述】:

来自以下指南:http://krondo.com/blog/?p=1682

延迟可以帮助我们避免我们在回调编程中发现的陷阱之一。当我们使用 deferred 来管理回调时,我们根本不会犯同时调用回调和 errback 的错误,或者调用回调 27 次。我们可以尝试,但是 deferred 会立即向我们抛出异常,而不是将我们的错误传递给回调本身

谁能给我一个更好的解释?

我注意到它无论如何都不起作用,因为在本教程中的大多数情况下,结束回调也调用 reactor.stop()。 但是为什么调用 deferred 两次没有意义呢?为什么和再次调用方法链有什么不同?

【问题讨论】:

    标签: python twisted


    【解决方案1】:

    Deferred 表示可能(现在或将来)可用但现在不一定可用的请求的结果。

    结果通过Deferreds,通过他们的回调链。例如,在一个同步程序中,你可能有这样的东西:

    response_bytes = make_request(...)
    response_dict = parse_json(response_bytes)
    response_object = construct_object(response_dict)
    return response_object.method()
    

    转换为返回Deferred 的代码,这是:

    response_bytes_later = make_request_async(...)
    response_dict_later = response_bytes_later.addCallback(parse_json)
    response_object_later = response_dict_later.addCallback(construct_object)
    return response_object_later.addCallback(lambda response_object:
                                             response_object.method())
    

    询问为什么你不能触发(或“回调”)make_request_async 返回的Deferred 类似于多次询问为什么不能有make_request 返回导致重新发出请求。如果要在同步版本中再次发出请求,则必须再次调用make_request(并获得新结果)。如果你想在异步版本中再次发出请求,你必须再次调用make_request_async(并获得一个新的Deferred)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2015-04-03
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多