为什么我们不能称为Twisted延迟两次?

时间:2014-05-13 18:56:01

标签: python twisted

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

  

延迟可以帮助我们避免使用回调编程识别出的一个陷阱。当我们使用延迟来管理我们的回调时,我们根本不能错误地调用回调和错误回调,或者调用回调27次。我们可以尝试,但是延迟会在我们身上发出异常,而不是将我们的错误传递给回调本身

有人能给我一个更好的解释吗?

我注意到它无论如何都不会起作用,因为在本教程的大多数情况下,结束回调也会调用reactor.stop()。 但是,为什么两次调用延期是不合理的呢?为什么与再次调用一系列方法有什么不同?

1 个答案:

答案 0 :(得分:7)

Deferred表示可能(现在或将来)可用的请求的结果,但现在无法获得。

结果Deferred s,通过他们的回调链。例如,在同步程序中,您可能会遇到以下内容:

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())

询问为什么你不能解雇(或“回拨”)Deferred返回的make_request_async类似于问你为什么不能make_request 返回< / em>多次使请求重新发布。如果要在同步版本中再次发出请求,则必须再次调用make_request(并获得新结果)。如果您想在异步版本中再次发出请求,则必须再次致电make_request_async(并获取新的Deferred)。