Giả sử chúng tôi có 3 tác vụ không đồng bộ trả lại Lời hứa: A
, B
và C
. Chúng tôi muốn chuỗi chúng lại với nhau (có nghĩa là, vì lợi ích của sự rõ ràng, lấy giá trị trả về bởi A
và gọi B
với nó), nhưng cũng muốn xử lý các lỗi chính xác cho mỗi và thoát ra ở thất bại đầu tiên. Hiện nay, tôi thấy 2 cách để làm điều này:Làm thế nào để xử lý lỗi đúng trong chuỗi Promise?
A
.then(passA)
.then(B)
.then(passB)
.then(C)
.then(passC)
.catch(failAll)
Ở đây, passX
chức năng xử lý mỗi sự thành công của các cuộc gọi đến X
. Nhưng trong hàm failAll
, chúng tôi phải xử lý tất cả các lỗi của A
, B
và C
, điều này có thể phức tạp và không dễ đọc, đặc biệt nếu chúng tôi có nhiều hơn 3 tác vụ không đồng bộ. Vì vậy, theo cách khác mất này vào xem xét:
A
.then(passA, failA)
.then(B)
.then(passB, failB)
.then(C)
.then(passC, failC)
.catch(failAll)
Ở đây, chúng tôi tách ra logic của bản gốc failAll
vào failA
, failB
và failC
, mà dường như đơn giản và dễ đọc, vì tất cả các lỗi được xử lý ngay bên cạnh nguồn của nó . Tuy nhiên, điều này không làm những gì tôi muốn.
Hãy xem nếu A
không thành công (bị từ chối), failA
không được tiếp tục gọi B
, do đó phải ném ngoại lệ hoặc từ chối cuộc gọi. Nhưng cả hai trường hợp này đều bị bắt bởi failB
và failC
, nghĩa là failB
và failC
cần biết nếu chúng tôi đã thất bại hoặc không, có lẽ là giữ trạng thái (tức là biến).
Hơn nữa, có vẻ như chúng tôi có nhiều tác vụ không đồng bộ hơn, chức năng failAll
của chúng tôi tăng kích thước (cách 1) hoặc nhiều hơn failX
chức năng được gọi (cách 2). Điều này đưa tôi đến câu hỏi của tôi:
Có cách nào tốt hơn để thực hiện việc này không?
Xem xét: Vì ngoại lệ trong then
được xử lý bằng phương pháp từ chối, nên có phương pháp Promise.throw
để thực sự ngắt chuỗi?
A possible duplicate, với câu trả lời bổ sung thêm phạm vi bên trong trình xử lý. Không phải là hứa hẹn phải tôn vinh chuỗi tuyến tính các hàm, và không truyền các hàm truyền các hàm truyền các hàm?
trùng lặp có thể xảy ra của [chuỗi lời hứa Break và gọi một chức năng dựa trên các bước trong chuỗi nơi nó bị hỏng (bị từ chối)] (http://stackoverflow.com/questions/20714460/break-promise-chain-and-call-a-function-based-on-the-step-in-the-chain-where-it) – wing
@wing Xin lỗi, tôi cũng nên làm rõ điều này - trong hàm 'passX' và' failX', tôi thực sự "đang xử lý thành công" của cuộc gọi đến 'X'. Ví dụ, 'A' là một cuộc gọi GET XMLHTTPRequest đến một API, và' passA' cập nhật trạng thái của đối tượng DOM tương ứng để nói "được tìm nạp", trước khi tiếp tục gọi một API 'B' khác. Tôi sẽ ghi chú điều này trong câu hỏi của mình. –
"* Không hứa hẹn sẽ tôn trọng chuỗi tuyến tính của các chức năng *" - không phải để xử lý lỗi có nhiều hơn chuỗi. Từ [Cách thích hợp để bỏ qua một chức năng sau đó trong lời hứa] (http://stackoverflow.com/q/21576862/1048572): * Đối với phân nhánh, bạn sẽ luôn cần một mức bổ sung làm tổ. * Điểm hứa hẹn chỉ là bạn vẫn có thể 'return' ra khỏi các hàm lồng nhau đó, thay vì cần gọi lại một cuộc gọi lại. – Bergi