Я пытаюсь запустить несколько асинхронных задач последовательно, используя обещания. Каждая задача должна запускаться сразу после завершения предыдущей. Это упрощенный пример того, что я пробовал:
var order = [];
var tasks = [
new Promise(resolve => {
order.push(1);
setTimeout(() => {
order.push(2)
resolve();
}, 100);
}),
new Promise(resolve => {
order.push(3);
setTimeout(() => {
order.push(4)
resolve();
}, 100);
}),
new Promise(resolve => {
order.push(5);
resolve();
})
];
tasks.reduce((cur, next) => cur.then(next), Promise.resolve()).then(() => {
console.log(order); // [ 1, 3, 5 ]
});
setTimeout(() => console.log(order), 200); // [ 1, 3, 5, 2, 4 ]
Я ожидаю, что order
будет равно [ 1, 2, 3, 4, 5 ]
в функции обратного вызова. Однако я получил эти странные результаты ([ 1, 3, 5 ]
в обратном вызове then
и [ 1, 3, 5, 2, 4 ]
в отложенной функции). Что мне не хватает?
waterfall
из библиотекиasync
: github.com/caolan/async - person cl3m   schedule 24.03.2016setTimeout
задерживает разрешение(), но не задерживает действия внутри обещания. - person jmcgriz   schedule 24.03.2016new Promise(function() {...
, выполняется обратный вызов обещания (вы используете стрелочные функции, но то же самое). Если вы хотите запускать их последовательно, а не параллельно, вы не можете создавать такие промисы в массиве, вам нужно придумать что-то другое. - person adeneo   schedule 24.03.2016