jest to wspólny wzór, że kaskada całej listy źródeł danych z pierwszego sukcesu zerwania łańcucha tak:Wdrożenie fallback za pomocą obietnic
var data = getData1();
if (!data) data = getData2();
if (!data) data = getData3();
et cetera. jeśli getDataN() funkcje są asynchroniczne, jednak prowadzi nas do 'piekła zwrotnej':
var data;
getData1(function() {
getData2(function() {
getData3(function() { alert('not found'); })
})
});
gdzie implementacje może wyglądać tak:
function getData1(callback) {
$.ajax({
url: '/my/url/1/',
success: function(ret) { data = ret },
error: callback
});
}
... obietnicami I spodziewałby się napisać coś takiego:
$.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; });
gdzie drugi .then
rzeczywiście odnosi się do wartości zwracanej pierwszy .fail
, która sama w sobie jest obietnicą, a którą zrozumiałem, była przykuta jako dane wejściowe do kolejnego kroku łańcucha.
Wyraźnie się mylę, ale jaki jest właściwy sposób, aby to napisać?
'getData1' powinien powrócić' $ .ajax' obietnicy. – hsz
Pierwsza myśl: możesz dalej przekazywać obietnicę (jako drugi parametr), po sukcesie wypełniasz obietnicę, po niepowodzeniu uruchamiasz wywołanie zwrotne. –
Myślę, że nie można tego zrobić na funkcji asynchronicznej. Dlaczego nie korzystać z rekurencyjnego wywołania zwrotnego i prostego jeśli-else? – dann