Tôi gặp vấn đề trong việc hiểu tại sao những lời từ chối không được truyền qua chuỗi lời hứa và tôi hy vọng một người nào đó có thể giúp tôi hiểu tại sao. Với tôi, việc gắn chức năng vào một chuỗi các lời hứa ngụ ý một ý định rằng tôi phụ thuộc vào một lời hứa ban đầu sẽ được đáp ứng. Thật khó giải thích, vì vậy hãy để tôi hiển thị một ví dụ về vấn đề của tôi trước tiên. (Lưu ý:. Ví dụ này là sử dụng Node và các mô-đun nút chậm Tôi thử nghiệm này với Dojo 1.8.3 và đã có kết quả tương tự)Các lời hứa được giữ nguyên không bị từ chối
var d = require("deferred");
var d1 = d();
var promise1 = d1.promise.then(
function(wins) { console.log('promise1 resolved'); return wins;},
function(err) { console.log('promise1 rejected'); return err;});
var promise2 = promise1.then(
function(wins) { console.log('promise2 resolved'); return wins;},
function(err) { console.log('promise2 rejected'); return err;});
var promise3 = promise2.then(
function(wins) { console.log('promise3 resolved'); return wins;},
function(err) { console.log('promise3 rejected'); return err;});
d1.reject(new Error());
Kết quả chạy hoạt động này là sản lượng này:
promise1 rejected
promise2 resolved
promise3 resolved
Được rồi, với tôi, kết quả này không có ý nghĩa. Bằng cách gắn vào chuỗi lời hứa này, mỗi chuỗi sẽ ngụ ý ý định rằng nó sẽ phụ thuộc vào độ phân giải thành công của d1 và kết quả được truyền xuống chuỗi. Nếu lời hứa trong lời hứa1 không nhận được giá trị thắng, nhưng thay vào đó nhận được một giá trị err trong trình xử lý lỗi của nó, thì lời hứa tiếp theo trong chuỗi có chức năng thành công của nó như thế nào? Không có cách nào nó có thể vượt qua trên một giá trị có ý nghĩa cho lời hứa tiếp theo bởi vì nó đã không nhận được một giá trị riêng của mình.
Một cách khác tôi có thể mô tả những gì tôi đang nghĩ là: Có ba người, John, Ginger và Bob. John sở hữu một cửa hàng tiện ích. Gừng đi vào cửa hàng của anh ta và yêu cầu một túi các vật dụng có màu sắc khác nhau. Anh ta không có chúng trong kho, vì vậy anh ta sẽ gửi yêu cầu tới nhà phân phối của anh ấy để đưa chúng tới anh ta. Trong thời gian đó, anh ta đưa cho Ginger một kiểm tra mưa cho biết anh ta nợ cô ấy túi đồ vật dụng. Bob phát hiện ra Ginger đang nhận được các vật dụng và yêu cầu anh ta nhận được các widget màu xanh khi cô ấy thực hiện với họ. Cô ấy đồng ý và đưa cho anh ta một ghi chú cho biết cô ấy sẽ làm thế. Bây giờ, nhà phân phối của John không thể tìm thấy bất kỳ vật dụng nào trong nguồn cung cấp của họ và nhà sản xuất không làm cho chúng thêm nữa, vì vậy họ thông báo cho John, người mà lần lượt thông báo cho Ginger rằng cô ấy không thể nhận được các vật dụng. Làm thế nào để Bob có thể nhận được một widget màu xanh từ Ginger khi không nhận được bất kỳ chính mình?
Quan điểm thực tế thứ ba mà tôi có về vấn đề này là vấn đề này. Giả sử tôi có hai giá trị tôi muốn cập nhật vào cơ sở dữ liệu. Một là phụ thuộc vào id của khác, nhưng tôi không thể có được id cho đến khi tôi đã chèn nó vào một cơ sở dữ liệu và thu được kết quả. Ngày đầu đó, chèn đầu tiên phụ thuộc vào một truy vấn từ cơ sở dữ liệu. Các cuộc gọi cơ sở dữ liệu trả về các lời hứa mà tôi sử dụng để kết nối hai cuộc gọi thành một chuỗi.
var promise = db.query({parent_id: value});
promise.then(function(query_result) {
var first_value = {
parent_id: query_result[0].parent_id
}
var promise = db.put(first_value);
promise.then(function(first_value_result) {
var second_value = {
reference_to_first_value_id: first_value_result.id
}
var promise = db.put(second_value);
promise.then(function(second_value_result) {
values_successfully_entered();
}, function(err) { return err });
}, function(err) { return err });
}, function(err) { return err });
Hiện tại, nếu db.query không thành công, hàm này sẽ gọi hàm err của đầu tiên sau đó. Nhưng sau đó nó sẽ gọi chức năng thành công của lời hứa tiếp theo. Trong khi lời hứa đó đang chờ đợi kết quả của giá trị đầu tiên, thay vào đó nó sẽ nhận được thông báo lỗi từ hàm xử lý lỗi của nó.
Vì vậy, câu hỏi của tôi là, tại sao tôi có chức năng chuyển lỗi nếu tôi phải kiểm tra lỗi trong hàm thành công của mình?
Xin lỗi vì thời lượng này. Tôi chỉ không biết cách giải thích nó theo cách khác.
UPDATE và chỉnh
(Lưu ý:.. Tôi đã gỡ bỏ một phản ứng tôi đã từng thực hiện để một số ý kiến Vì vậy, nếu có ai nhận xét về phản ứng của tôi, ý kiến của họ có vẻ nằm ngoài bối cảnh bây giờ mà tôi loại bỏ nó Xin lỗi vì điều này, tôi đang cố gắng giữ điều này càng ngắn càng tốt.)
Cảm ơn mọi người đã trả lời. Tôi muốn xin lỗi tất cả mọi người vì đã viết ra câu hỏi của tôi quá tệ, đặc biệt là mã giả của tôi. Tôi hơi quá hung hăng trong việc cố gắng giữ nó ngắn gọn.
Nhờ phản hồi của Bergi, tôi nghĩ rằng tôi đã tìm thấy lỗi trong logic của mình. Tôi nghĩ rằng tôi có thể đã bỏ qua một vấn đề khác đã gây ra vấn đề tôi đang gặp phải. Điều này có thể khiến chuỗi lời hứa hoạt động khác với tôi nghĩ. Tôi vẫn đang thử nghiệm các yếu tố khác nhau của mã của tôi, vì vậy tôi thậm chí không thể hình thành một câu hỏi thích hợp để xem những gì tôi đang làm sai. Tôi đã muốn cập nhật tất cả các bạn mặc dù và cảm ơn bạn đã giúp đỡ của bạn.
Bạn đang sử dụng phiên bản nào? Điều này hiển thị 'bị từ chối' 3 lần đối với tôi vào 0.10.0 và bị hoãn 0.6.3. – loganfsmyth
Nó hoạt động cho tôi cũng như trên nút 0.8.3 và hoãn 0.6.3 https://gist.github.com/Stuk/694b2377057453aa6946 –