Это похоже на вопрос, который я опубликовал сегодня, но требует запрос последовательно. У меня есть два асинхронных запроса, где второму запросу нужен результат первого для отправки запроса.
var Db.get = function(key){
var deferred = $q.defer();
//send async req
var req = ....
req.success = function(d){
deferred.resolve(d)
};
req.failure = function(d){
deferred.reject(d)
}
return deferred.promise;
}
var someFn = function(id){
Db.get(id, "abc")
.then(function (d) {
console.log("At 1")
Db.get(d.id, "def")
.then(function (d) {
console.log("At 2")
return d
}, function (e) {
//error
});
}, function (e) {
//error
});
console.log("At 3")
};
Я должен думать неправильно, так как я ожидаю, что console.log("At 3")
никогда не будет напечатано в сценарии успеха, поскольку я вернусь после console.log("At 2")
. Но когда я запускаю, в консоли я вижу этот порядок
console.log("At 1")
console.log("At 3")
console.log("At 2")
Я думал, что then
будет блокироваться, пока не получит ответ от обещания (возвращенного get() ). поэтому все в someFn выполняется последовательно. Это предположение неверно? Каков наилучший способ связать две асинхронные операции, которые используют промисы, для последовательного запуска.
Спасибо.
РЕДАКТИРОВАТЬ:
Я попробовал то, что предложил Кетан цепочка вызовов Ajax в AngularJs .
var someFn = function(id){
Db.get(id, "abc")
.then(function (d) {
console.log("At 1")
return Db.get(d.id, "def")
}).then(function (d) {
console.log("At 2")
return d
}, function (e) {
//error
return null;
}).then(function (d) {
return d;
});
console.log("At 3")
};
Тем не менее, если я позвоню как
var res = someFn(1)
console.log(res) /// undefined
терминал Chrome показывает At 2
после undefined
. Я не уверен, почему результат, перенастроенный someFn
, не назначен res
.
someFn
ничего не вернул. Вам нужно использоватьsomeFn().then()
и получить доступ к значению из функции, переданнойthen
. Посмотрите это видео, в котором я обсуждаю обещания: plus.google.com/events/cljavmi7kpup1fso43k3fkpk2eg. - person Josh David Miller   schedule 01.05.2013