2014-05-13 14 views
7

Từ hướng dẫn sau đây: http://krondo.com/blog/?p=1682Tại sao chúng ta không thể gọi một Twisted hoãn lại hai lần?

Deferreds giúp chúng ta tránh một trong những cạm bẫy chúng tôi xác định với lập trình callback. Khi chúng tôi sử dụng hoãn lại để quản lý các cuộc gọi lại của mình, chúng tôi chỉ đơn giản là không thể mắc lỗi khi gọi cả gọi lại và trả lại lỗi hoặc gọi lại hai mươi bảy lần. Chúng tôi có thể thử, nhưng hoãn lại sẽ đưa ra một ngoại lệ ngay tại chúng tôi, thay vì chuyển sai lầm của chúng tôi vào các cuộc gọi lại tự mình

Có thể cho tôi giải thích rõ hơn không?

Tôi nhận thấy rằng nó sẽ không hoạt động được vì trong hầu hết các trường hợp trong hướng dẫn này, hàm gọi lại cũng gọi là reactor.stop(). Nhưng tại sao mặc dù nó không có ý nghĩa để gọi một hoãn lại hai lần? Tại sao nó lại khác với việc gọi một chuỗi các phương thức một lần nữa?

Trả lời

7

A Deferred thể hiện kết quả của một yêu cầu có thể có sẵn (hiện tại hoặc trong tương lai) nhưng hiện không có sẵn.

Kết quả luồng thông qua Deferred s, qua chuỗi gọi lại của chúng. Ví dụ, trong một chương trình đồng bộ, bạn có thể có một cái gì đó như:

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

Dịch sang các mã mà trả về một Deferred, đây là:

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

Hỏi lý do tại sao bạn không thể lửa (hoặc "Cuộc gọi trở lại ") số Deferred được trả lại bởi make_request_async tương tự như việc hỏi lý do tại sao bạn không thể có make_requesttrả lại nhiều lần để yêu cầu được phát hành lại. Nếu bạn muốn phát hành lại yêu cầu trong phiên bản đồng bộ, bạn phải gọi lại make_request (và nhận kết quả mới). Nếu bạn muốn gửi lại yêu cầu trong phiên bản không đồng bộ, bạn phải gọi lại make_request_async (và nhận số Deferred mới).

Các vấn đề liên quan