关于 angular 的$q,层层嵌套返回 promise,有没有更好的可读性写法?

2014-08-30 16:03:03 +08:00
 Pandora78
先把例子代码贴上:
//得到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;
}
有没有更好的写法呢?
4010 次点击
所在节点    问与答
1 条回复
qq529633582
2014-08-30 16:39:34 +08:00
首先,给返回promise的匿名函数起个名字~
嗯,好多了

如果//success那里没有do something的话
promise.then(deferred.resolve, deferred.reject);

或者,用coffee?
doSomethingPromise()
.then () ->
____ // do A
.then () ->
____ // do B
.then () ->
____ // do C
.then resolve, (err) ->
____ // handle error

(行首的下划线是缩进)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/130792

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX