2013-09-04 2 views
1

Я пытаюсь последовательно вызывать последовательность обещаний с использованием цикла for, но у меня возникают проблемы с работой в правильном порядке. Теоретически консоль должна регистрировать первый блок, но вместо этого записывать второй (подразумевая, что все обещания вызывают одновременно, по сравнению со вторым обещанием, которое вызывается только после первого).Проблемы с попытками использовать для циклов с последовательными обещаниями (q)

Я думал, что это может быть похоже на эту ссылку, но я думаю, что я объявляю функцию, а не вызываю ее в объявлении then? How to sequentially run promises with Q in Javascript?

Ожидаемый результат:

starting: 3 
ending: 3 
starting: 2 
ending: 2 
starting: 1 
ending: 1 

Фактический выход:

starting: 3 
starting: 2 
starting: 1 
ending: 1 
ending: 2 
ending: 3 

http://jsfiddle.net/4k6t9/3/

var app = angular.module('myApp', []); 
app.controller('MyCtrl', function($scope, $q, $timeout) { 
    var temp = $q.when({}); 
    var arr = [3, 2, 1]; 

    arr.forEach(function(element) { 
     temp = temp.then(delay(element)); 
    }) 

    function delay(timing) { 
     var deferred = $q.defer(); 
     console.log('starting: ' + timing) 
     $timeout(function() { 
      console.log('ending: ' + timing); 
      deferred.resolve(timing); 
     }, timing * 1000); 
     return deferred.promise; 
    } 
}); 

ответ

4

Ваша скрипка немного отличается от кода в вопросе. Но ты, где почти там. Не было только одного заявления о возврате.

Вы правы: temp = temp.then(delay(element)); звонки delay. Вместо этого вы хотите вернуть функцию, которая вызовет delay. (Вы должны были, что в скрипке.)

Единственное, что отсутствует был return, чтобы вернуть его :)

Вот рабочая скрипку: http://jsfiddle.net/4k6t9/6/

+0

Спасибо! Это сработало отлично! –

+1

@ DanTang Мне нравится использовать 'reduce' для создания последовательности обещаний: http://jsfiddle.net/czU8L/1/ –