这类似于我今天发布的问题,但需要串行链接请求。我有两个异步请求,第二个请求需要第一个请求的结果来发送查询。
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 中的所有内容都是串行执行的。这个假设是错误的吗?链接两个使用承诺的异步操作以串行运行的最佳方法是什么。
谢谢。
编辑:
我尝试了 Ketan在 AngularJs 中建议的 Chaining Ajax 调用。
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
not assigned to重新调整res
。