2014-05-13 61 views
7

從以下指南:http://krondo.com/blog/?p=1682爲什麼我們不能稱Twisted延遲兩次?

Deferreds幫助我們避免我們發現有回調編程的陷阱之一。當我們使用延遲來管理我們的回調時,我們根本不會犯這個錯誤,既要調用回調函數,又要調用errback函數,要麼調用回調函數27次。我們可以嘗試,但推遲將引發異常馬上回來看我們,而不是通過我們的失誤到自己的回調

誰能給我一個更好的解釋?

我注意到它不會工作,因爲在本教程的大多數情況下,結束回調函數也會調用reactor.stop()。 但是,爲什麼稱它延遲兩次沒有意義呢?爲什麼它與再次調用一系列方法有什麼不同?

回答

7

A Deferred代表可能(現在或將來)可用的請求的結果,但現在不是絕對可用的。

結果流程Deferred s,通過它們的回調鏈。例如,在一個同步的程序,你可能會碰到這樣的:

​​

翻譯到返回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)。

相關問題