2013-09-21 6 views
1

Я выполняю несколько групповых асинхронных операций в своем коде. Хотя операции внутри пакета должны выполняться асинхронно, партии должны выполняться синхронно один за другим.Цепочки обещаний не выполняются последовательно с использованием библиотеки Q-обещаний

jsfiddle Я создал. Посмотрите на консоль, так как все выходные есть. И вот код для удобства:

asyncChain(10, 'FIRST CHAIN') 
.then(function() { 
    asyncChain(10, 'SECOND CHAIN'); 
}) 
.then(function(){ 
    asyncChain(10, 'THIRD CHAIN'); 
}); 

function asyncChain(n, msg) { 
    var promiseChain = Q.fcall(function() { 
    10; 
    }); 
    console.log('starting:' + msg); 
    for (var i = 0; i < n; i++) { 
    promiseChain = promiseChain.then(asyncOperation(i, msg)); 
    } 
    console.log('returning' + msg); 
    return promiseChain; 
} 

function asyncOperation(i, msg) { 
    var d = Q.defer(); 

    setTimeout(function() { 
    console.log('resolving for #' + i + msg); 
    d.resolve(i); 
    }, 300 + Math.random()*1000); 

    return d.promise; 
} 

В основном это 3 операции с обеими партиями, которые я ожидаю, чтобы закончить один за другим. Значение выходного сигнала для данного образца будет что-то вроде этого:

starting FIRST CHAIN 
returning FIRST CHAIN 
resolving 1..10 FIRST CHAIN 

starting SECOND CHAIN 
returning SECOND CHAIN 
resolving 1..10 SECOND CHAIN 
and so on 

Я попытался с помощью all() метод вместо then() но он остановил выполнение после первой цепи. Мне что-то не хватает?

Спасибо за любой совет.

Приветствия

+0

Внутри партий «асинхронный» вы все еще имеете в виду «последовательно», а не «параллельно»? – Bergi

+0

Я имел в виду последний. –

ответ

6

я упускаю что-то очевидное?

Да. Для then для решения обещания с другим обещанием, вы должны вернуть, что другие обещания. Ваша функция просто запустит другой asyncChain, но возвращает undefined из обратного вызова, который немедленно устраняет обещание.

asyncChain(10, 'FIRST CHAIN').then(function() { 
    return asyncChain(10, 'SECOND CHAIN'); 
}).then(function(){ 
    return asyncChain(10, 'THIRD CHAIN'); 
}); 
+0

Спасибо за это, я думаю, что я просто потратил слишком много времени, глядя на тот же код :) Я также обнаружил, что использование метода thenResolve делает синтаксис более читабельным, а анонимные функции не должны определяться. –

+0

Но 'thenResolve' не ждет первого обещания, прежде чем он оценит' asyncChain (...) ', сделав его параллельным снова? – Bergi

+0

thenResolve() - это просто сахар для функции() {}. Проверьте это на линии source -. –

Смежные вопросы