Мне нужно вызвать 3 функции с запросами AJAX до того, как одна из функций будет готова. Для всех функций нужны одни и те же данные, поэтому я хочу запустить запрос AJAX только один раз. Я думаю, что мне нужна функциональность, чтобы вызывать 2 из 3 функций, чтобы ждать и предоставлять данные в конце. Может быть, проблема в том, что я новичок в jQuery Deferred и не нашел какой-то основной материал? Спасибо за помощь!jQuery deferrend; callback для функций ожидания
Поскольку мой сценарий является сложным, как, например, таким образом я создал эту демонстрацию (я надеюсь, что это говорит само за себя)
<script>
var requestRunning = false;
//do some ajax request etc...
function doSomething() {
return {
doIt: function (test, startDelay) {
var dfd = $.Deferred();
setTimeout(function() {
if (requestRunning == false) {
console.log("starting ajax call:", test);
requestRunning = true;
//Fake ajax call
setTimeout(function() {
dfd.resolve(test);
// Todo: A done; provide data to waiting B and C.
}, 500);
}
else {
console.log("ajax call allready running, waiting...", test);
}
}, startDelay);
return dfd.promise();
}
}
}
// Fake delay for function calls in really short time
var master = doSomething();
var a = master.doIt("a", 10);
var b = master.doIt("b", 15);
var c = master.doIt("c", 12);
// Do some stuff with the received data...
a.done(function myfunction(result) {
console.log(result + " done");
});
b.done(function myfunction(result) {
console.log(result + " done");
});
c.done(function myfunction(result) {
console.log(result + " done");
});
</script>
Похоже, что вы хотите выполнить последовательность a, b и c, но на 100% не ясно, какая должна быть последовательность. Например, у вас может быть «a тогда b, а затем c» или «a» (b и c параллельно) 'или' (a и b параллельно), затем c 'или' (a, b и c параллельно) then something_else '. Любое из них возможно. –
Существует не определенный порядок для A, B и C. Иногда только A нуждается в данных; в противном случае все 3 нуждаются в данных. Но если более одной функции нужны данные, я хочу только запустить 1 ajax-вызов (данные результата для A/B/C одинаковы) – Chris
Извините, я не понимаю. –