Tôi đang cố gắng tìm hiểu một chút về lập trình Node và không đồng bộ. Tôi đọc về Lời hứa và đã cố gắng sử dụng chúng trong một dự án nhỏ sao chép bài đăng cho người dùng từ Dịch vụ A đến Dịch vụ B. Tôi gặp một số khó khăn khi hiểu cách tốt nhất để vượt qua trạng thái giữa Lời hứaCó những mẫu gì để vượt qua trạng thái thông qua một chuỗi các lời hứa trong Javascript?
Dự án được viết cho NodeJS sử dụng Promise library
một định nghĩa đơn giản của vấn đề hiện tại của tôi là:
- sao chép bài viết cho một người sử dụng từ dịch vụ từ A đến B Dịch vụ nếu bài viết chưa tồn tại trong dịch vụ B.
- Cả hai dịch vụ đều cung cấp các API http yêu cầu không phải id người dùng đáng nhớ để tra cứu bài đăng cho người dùng đó để id người dùng phải được tra cứu từ tên người dùng.
- Tất cả các cuộc gọi http đều không đồng bộ.
Đây là một số mã giả minh họa cách tôi đã ghép các Lời hứa với nhau.
Promise.from('service_A_username')
.then(getServiceAUserIdForUsername)
.then(getServiceAPostsForUserId)
.then(function(serviceAPosts) {
// but what? store globally for access later?
doSomethingWith(serviceAPosts);
return Promise.from('service_B_username');
})
.then(getServiceBUserIdForUsername)
.then(getServiceBPostsForUserId)
.done(function(serviceBPosts) {
// how do we interact with Service A posts?
doSomethingThatInvolvesServiceAPostsWith(serviceBPosts);
});
Có một vài điều mà tôi đã nghĩ đến việc thực hiện:
- Mang cuộc gọi getIdForUsername bên trong hàm getPostsForUserId. Tuy nhiên, tôi muốn giữ cho từng đơn vị chức năng đơn giản nhất có thể theo nguyên tắc 'làm một việc và làm tốt'.
- Tạo đối tượng 'bối cảnh' và chuyển nó qua toàn bộ chuỗi, đọc và lưu trữ trạng thái trong đối tượng này. Tuy nhiên cách tiếp cận này làm cho mỗi chức năng rất riêng biệt cho một chuỗi và do đó khó sử dụng trong sự cô lập.
Có bất kỳ tùy chọn nào khác và cách tiếp cận nào được đề xuất không?
FWIW, tùy chọn đối tượng bối cảnh không phải là tất cả * mà * xấu. Nếu bạn nghĩ của 'getServiceAUserIdForUsername' chức năng như "chấp nhận một 'lập luận userName' và trả về một' userId'", sau đó "chấp nhận một đối tượng với một 'tài sản userName' và điền vào một' tài sản userId'" không * rằng * cụ thể hơn đối với trường hợp sử dụng. Chắc chắn có nhiều khớp nối hơn (gọi mã và chức năng cần phải đồng ý về những tên đó, mà thông thường chúng sẽ không), nhưng thực tế là nếu bạn muốn nhiều hơn "chỉ một kết quả arg trong một giá trị trả về", bạn sẽ cần để có một số cách xác định các bit khác nhau. –
Nhưng nếu bạn muốn, tôi có thể thấy có một cơ sở hạ tầng tập hợp chung chung để chỉ mã gọi điện thoại mới biết những tên thuộc tính đó. Cơ sở hạ tầng aggregator sẽ chấp nhận một danh sách "một sản lượng arg một kết quả" chức năng của bạn Promise-enabled (vì vậy không có tên được biết đến với những chức năng) và tên sử dụng, và quấn các cuộc gọi cho họ để điền vào các đối tượng. Hừm. Tôi tự hỏi nó sẽ như thế nào. –
Cảm ơn @ t-j-crowder Đối với một đối tượng ngữ cảnh đang được chuyển qua một đường ống, bạn có biết về bất kỳ thư viện JS nào sử dụng mẫu này một cách cụ thể không? Java có [Apache Camel] (http://camel.apache.org/) được đặc biệt hướng đến loại định tuyến đó và tôi tự hỏi liệu có điều gì tương tự với js hay không. –