Có gì khác biệt?
Cuộc .then()
gọi sẽ trả lại một lời hứa sẽ bị từ chối trong trường hợp cuộc gọi lại bị lỗi. Điều này có nghĩa là, khi thành công của bạn logger
thất bại, lỗi sẽ được chuyển sang cuộc .catch()
gọi lại sau , nhưng không phải là fail
cuộc gọi lại đi cùng success
.
Đây là sơ đồ luồng điều khiển :
Để thể hiện nó trong mã đồng bộ:
// some_promise_call().then(logger.log, logger.log)
then: {
try {
var results = some_call();
} catch(e) {
logger.log(e);
break then;
} // else
logger.log(results);
}
Đối số thứ hai log
(giống như đối số thứ nhất .then()
) sẽ chỉ được thực thi trong trường hợp không có ngoại lệ xảy ra. Khối được gắn nhãn và break
tuyên bố cảm thấy hơi kỳ lạ, đây thực sự là những gì python đã try-except-else
cho (đọc khuyến nghị!).
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
Trình catch
ghi nhật ký cũng sẽ xử lý các trường hợp ngoại lệ từ cuộc gọi logger thành công.
Quá nhiều cho sự khác biệt.
Tôi không hiểu lời giải thích của nó về việc thử và bắt
Đối số là thông thường bạn muốn bắt lỗi trong mỗi bước xử lý và bạn không nên sử dụng nó trong chuỗi. Kỳ vọng là bạn chỉ có một trình xử lý cuối cùng xử lý tất cả các lỗi - trong khi, khi bạn sử dụng "antipotype", các lỗi trong một số cuộc gọi lại sau đó không được xử lý.
Tuy nhiên, mẫu này thực sự rất hữu ích: Khi bạn muốn xử lý các lỗi xảy ra trong chính xác bước này và bạn muốn làm một cái gì đó hoàn toàn khác khi không có lỗi xảy ra - tức là khi lỗi không thể phục hồi. Hãy lưu ý rằng điều này đang phân nhánh luồng kiểm soát của bạn. Tất nhiên, điều này đôi khi là mong muốn.
Điều gì sai với điều này sau đây?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Rằng bạn phải lặp lại cuộc gọi lại. Bạn muốn
some_promise_call()
.catch(function(e) {
return e; // it's OK, we'll just log it
})
.done(function(res) {
logger.log(res);
});
Bạn cũng có thể xem xét sử dụng .finally()
cho việc này.
then().catch()
dễ đọc hơn, vì bạn không cần tìm kiếm dấu phẩy và điều tra là cuộc gọi lại này để thành công hay thất bại chi nhánh.