Ваш ответ верный. Однако я подумал, что я бы предложил альтернативу. Вы можете быть заинтересованы в $ q.serial, если часто встречаетесь с обещаниями по цепочке.
var items = ['one', 'two', 'three'];
var tasks = items.map(function (el) {
return function () { foo(el, (items.length - i)*1000)); });
});
$q.serial(tasks);
function setTimeoutPromise(ms) {
var defer = $q.defer();
setTimeout(defer.resolve, ms);
return defer.promise;
}
function foo(item, ms) {
return function() {
return setTimeoutPromise(ms).then(function () {
console.log(item);
});
};
}