Как мне написать рекурсивный цикл для правильного выполнения обещаний по порядку? Я пробовал с Promise.all (Array.map (function () {})); что не соответствует моим потребностям, так как эти шаги нужно выполнять последовательно. Я пробовал использовать индивидуальное обещание, потому что нашел здесь , но и здесь есть проблемы.
Обещание:
var promiseFor = (function(condition, action, value) {
var promise = new Promise(function(resolve, reject) {
if(!condition(value)) {
return;
}
return action(value).then(promiseFor.bind(null, condition, action));
});
return promise;
});
Проблема с этим в том, что кажется, что он останавливается на самом глубоком рекурсивном вызове, не возвращаясь для продолжения выполнения цикла для правильного завершения.
Например: в PHP такой код:
function loopThrough($source) {
foreach($source as $value) {
if($value == "single") {
//do action
} else if($value == "array") {
loopThrough($value);
}
}
}
Если я пропущу, скажем, структуру папок, а «один» означает файл, он распечатает все файлы. Но обещание, что я использую стопы в первом тупике.
РЕДАКТИРОВАТЬ: добавлен bluebird, чтобы узнать, может ли он чем-нибудь помочь, все то же самое. Вот текущий код цикла
var runSequence = (function(sequence, params) {
return Promise.each(sequence, function(action) {
console.log(action['Rusiavimas'] + ' - ' + action['Veiksmas']);
if(params.ButtonIndex && params.ButtonIndex != action['ButtonIndex']) {
return Promise.resolve();
}
if(action['Veiksmas'].charAt(0) == '@') {
var act = action['Veiksmas'];
var actName = act.substr(0, act.indexOf(':')).trim();
var actArg = act.substr(act.indexOf(':')+1).trim();
/* This one is the code that figures out what to do and
also calls this function to execute a sub-sequence. */
return executeAction(actName, actArg, params);
} else {
sendRequest('runQuery', action['Veiksmas']);
}
});
});
У меня есть 3 последовательности, каждая из которых состоит из 5 действий. Первая и вторая последовательности имеют следующую последовательность как третье действие. Вот результат, который я получаю (числа означают, какая последовательность):
1 - @PirmasVeiksmas
1 - @AntrasVeiksmas
1 - @Veiksmas: list_two
2 - @PirmasVeiksmas
2 - @AntrasVeiksmas
2 - @Veiksmas: list_three
3 - @PirmasVeiksmas
3 - @AntrasVeiksmas
3 - @TreciasVeiksmas
3 - @KetvirtasVeiksmas
3 - @PenktasVeiksmas
Как вы можете видеть, он входит в следующую последовательность и продолжается, как и должен, но после завершения третьей последовательности следует возобновить вторую последовательность и завершить первую. Но он останавливается, как только попадает в первый тупик в рекурсии.
EDIT2: пример Codepen того, что у меня есть сейчас, и с визуальным представлением того, что происходит: Ссылка Codepen
Результат должен быть:
fa1
second
sa1
third
ta1
ta2
ta3
sa3
fa3
Promise
. Вот почему я хотел, чтобы вы связали исходный код этого кода, чтобы я мог ударить его автора. - person Bergi   schedule 01.04.2016promiseFor
. Работает при правильном написании. - person Bergi   schedule 01.04.2016