Я использую библиотеку обещаний Q. Мой код основан на том, что обратные вызовы для одного обещания выполняются в том же порядке, в каком они были зарегистрированы.
var deferred = Q.defer();
var promise = deferred.promise;
['first', 'second', 'third'].forEach(function (position) {
promise.then(function () {
alert(position);
});
});
deferred.resolve();
Это дает правильный результат, но я не знаю, является ли это частью спецификации или счастливым совпадением, которое может сломать линию.