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
});