Цепочка $ .ajax () для синхронных запросов с Q не работает

var chain = Q (); for ( var i = 0 ; i < x . length ; i ++) { chain = chain . затем ( $ . ajax ({ type : "POST" , url : data_url , data : pdata }) ); цепь возврата ; необходимо получить ресурс A, за которым следует B, и т. д. unt.then () l n. .then () сделал это следующим образом, следуя официальному руководству https://github.com/kriskowal/q#sequences .

.then()

jquery,ajax,promise,q,

0

Ответов: 1


1 принят

var chain = Q(); for (var i = 0; i < x.length; i++) { chain = chain.then(function(priorResults) { return $.ajax({ type: "POST", url: data_url, data: pdata }); }); } return chain;обработчики принимают ссылки на функции как аргументы, а не обещают. Ваш код немедленно выполнял ваши вызовы ajax, а затем передавал возвращенное обещание .then()обработчику, который недействителен.

Если вы хотите, чтобы вызовы Ajax выполнялись позже и последовательно, тогда вам нужно поместить их в такую ??функцию, чтобы вы могли передать эту ссылку функции $.ajax(). Таким образом, инфраструктура обещаний может вызвать вашу функцию в будущем:

i

Вы передаете ссылку функции .then()обработчику, чтобы инфраструктура обещания могла выполнить эту функцию позже.

Как и вы, все forзвонки были немедленно выполнены, и только обещания, в которых были прикованы.

Если вы пытаетесь использовать iпеременную внутри iобработчика, это не будет работать должным образом, потому что .then()цикл будет завершен и iбудет иметь значение своего терминала при letвызове обработчика. Обычным решением является либо использование forв ES6 .forEach () forпеременной цикла, итерация с чем-то вроде iили для того, чтобы убедиться, что forцикл содержит функцию / замыкание, которая может однозначно фиксировать каждое отдельное значение iпеременной. Более подробная информация может быть предоставлена, если вы указали свой фактический код.


PS Я предполагаю, что в вашем вопросе есть недостающий код, потому что вы, вероятно, не хотите каждый раз выполнять один и тот же вызов Ajax.

Если вы выполняете итерацию массива, тогда общий шаблон проектирования для последовательного повторения массива с использованием обещаний выглядит .reduce()следующим образом:

array.reduce(function(p, item) {
    return p.then(function(priorResult) {
        return $.ajax(...);
    });
}, Q()).then(function(result) {
    // everything done here, final result
});
JQuery, AJAX, обещают, д,
Похожие вопросы