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