先把例子代码贴上:
//得到N个简明的学校信息
getSchoolsSummary: function() {
var deferred = $q.defer();
$http({
method: 'GET',
url: '/api/schools'
}).success(function(res) {
if (res._metadata.code === 200 && res.data) {
deferred.resolve(res.data);
} else {
deferred.reject(res._metadata.message);
}
});
return deferred.promise;
}
asyncGetSchools: function() {
var outer_deferred = $q.defer();
//先得到N个学校的简明信息,只包括id,学校名称...
getSchoolsSummary().then(function(schools) {
var promises = schools.map(function(school) {
var deferred = $q.defer();
//传id进去,得到每个学校的详细信息
$http({
method: 'GET',
url: '/api/schools/' +
school.id }).success(function(res) {
if (res._metadata.code === 200 && res.data) {
deferred.resolve(res.data);
} else {
deferred.reject(res._metadata.message);
}
});
return deferred.promise;
});
//搞定,得到所有学校的详细信息
$q.all(promises).then(function(data) {
outer_deferred.resolve(data);
}, function(error) {
outer_deferred.reject(error);
});
});
return outer_deferred.promise;
}
如果我要把asyncGetSchools包装到一个init函数中,init内又得写成:
init : function() {
//do something
do_something();
var deferred = $q.defer();
var promise = asyncGetSchools();
promise.then(function(data) {
//success
deferred.resolve(data);
},function(error) {
deferred.reject(error);
});
return deferred.promise;
}
有没有更好的写法呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/130792
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.