【发布时间】:2013-05-01 02:15:53
【问题描述】:
这类似于我发布的问题today,但需要串行链接请求。我有两个异步请求,第二个请求需要第一个请求的结果来发送查询。
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 2") 之后返回时,console.log("At 3") 永远不会在成功的情况下被打印出来。但是当我运行时,在控制台中我看到了这些顺序
console.log("At 1")
console.log("At 3")
console.log("At 2")
我在想then 会阻塞直到它得到承诺的响应(由 get() 返回)。因此, someFn 中的所有内容都是串行执行的。这个假设是错误的吗?链接两个异步操作(使用 Promise)以串行运行的最佳方式是什么。
谢谢。
编辑:
我尝试了 Ketan 建议的 Chaining Ajax calls in 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 终端在undefined 之后显示At 2。我不确定为什么someFn 重新调整的结果没有分配给res。
【问题讨论】:
-
查看Pawel 昨天回答的这个问题。 stackoverflow.com/questions/16284403/…
-
感谢科坦。会试试看。
-
因为
someFn没有返回任何东西。您需要使用someFn().then()并从传递给then的函数中访问值。观看我讨论承诺的视频:plus.google.com/events/cljavmi7kpup1fso43k3fkpk2eg
标签: javascript angularjs promise