nó là một mô hình phổ biến mà chúng ta thác qua một danh sách các nguồn dữ liệu với sự thành công đầu tiên phá vỡ chuỗi như thế này:Thực hiện một dự phòng sử dụng những lời hứa
var data = getData1();
if (!data) data = getData2();
if (!data) data = getData3();
vân vân. nếu getDataN() chức năng là không đồng bộ, tuy nhiên, nó đưa chúng ta đến 'callback địa ngục':
var data;
getData1(function() {
getData2(function() {
getData3(function() { alert('not found'); })
})
});
nơi triển khai có thể giống như thế:
function getData1(callback) {
$.ajax({
url: '/my/url/1/',
success: function(ret) { data = ret },
error: callback
});
}
... với những lời hứa Anh sẽ mong đợi để viết một cái gì đó như thế này:
$.when(getData1())
.then(function (x) { data = x; })
.fail(function() { return getData2(); })
.then(function (x) { data = x; })
.fail(function() { return getData3(); })
.then(function (x) { data = x; });
nơi thứ hai .then
thực sự đề cập đến giá trị trả về của 0 đầu tiên, đó là chính nó là một lời hứa, và điều mà tôi hiểu là bị xích vào như là đầu vào cho bước chuỗi thành công.
rõ ràng tôi sai nhưng cách viết chính xác là gì?
'getData1' nên trả lại '$ .ajax' lời hứa. – hsz
Suy nghĩ đầu tiên: bạn có thể tiếp tục truyền lời hứa xung quanh (như một tham số thứ hai), về thành công bạn hoàn thành lời hứa, về thất bại bạn chạy gọi lại. –
Tôi nghĩ rằng bạn không thể làm điều đó trên chức năng asyncrhronous. Tại sao không sử dụng gọi lại đệ quy và đơn giản nếu khác? – dann