来自以下指南:http://krondo.com/blog/?p=1682
延迟可以帮助我们避免使用回调编程识别出的一个陷阱。当我们使用延迟来管理我们的回调时,我们根本不能错误地调用回调和错误回调,或者调用回调27次。我们可以尝试,但是延迟会在我们身上发出异常,而不是将我们的错误传递给回调本身
有人能给我一个更好的解释吗?
我注意到它无论如何都不会起作用,因为在本教程的大多数情况下,结束回调也会调用reactor.stop()。 但是,为什么两次调用延期是不合理的呢?为什么与再次调用一系列方法有什么不同?
答案 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
)。