这是一个创建于 3769 天前的主题,其中的信息可能已经有所发展或是发生改变。
先把例子代码贴上:
//得到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;
}
有没有更好的写法呢?
1 条回复 • 2014-08-30 16:39:34 +08:00
|
|
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
(行首的下划线是缩进)
|