我编写的代码看起来像:
function getStuffDone(param) { | function getStuffDone(param) {
var d = Q.defer(); /* or $q.defer */ | return new Promise(function(resolve, reject) {
// or = new $.Deferred() etc. | // using a promise constructor
myPromiseFn(param+1) | myPromiseFn(param+1)
.then(function(val) { /* or .done */ | .then(function(val) {
d.resolve(val); | resolve(val);
}).catch(function(err) { /* .fail */ | }).catch(function(err) {
d.reject(err); | reject(err);
}); | });
return d.promise; /* or promise() */ | });
} | }
Run Code Online (Sandbox Code Playgroud)
有人告诉我这个被称为" 延迟反模式 "或" Promise构造函数反模式 ",这个代码有什么不好,为什么这被称为 …
编辑
第一个答案是优雅的答案,但是,正如在这个问题中提到的几次以及有关stackoverflow的另一个问题,问题是服务和控制器在数据实际到达之前运行它们的东西.
(最后评论第一个答案:)
是的,问题是API调用在服务运行后完成并将所有内容返回给控制器,请参见此处screencast.com/t/uRKMZ1IgGpb7 ...这是我的基础问题,我怎么能等待数据的所有部分到到达?
这就像我说的是在重复,我们如何使该填充成功的数据检索后的阵列服务,并在控制器后,这一切让数据发生,因为你可以在我的截图中看到,事情在不同的运行订购.
我有这个代码:
var deferred = $q.defer();
$http.get('../wordpress/api/core/get_category_posts/?category_id=14 ').success(function(data) {
//we're emptying the array on every call
theData = [];
catName = data.category.slug;
theData = data;
theData.name = catName;
aggregatedData.push(theData);
});
$http.get('../wordpress/api/core/get_category_posts/?category_id=15 ').success(function(data) {
theData = [];
catName = data.category.slug;
theData = data;
theData.name = catName;
aggregatedData.push(theData);
});
$http.get('../wordpress/api/core/get_category_posts/?category_id=16 ').success(function(data) {
theData = [];
catName = data.category.slug;
theData = data;
theData.name = catName;
aggregatedData.push(theData);
});
$http.get('../wordpress/api/core/get_category_posts/?category_id=17 ').success(function(data) {
theData = [];
catName = data.category.slug; …Run Code Online (Sandbox Code Playgroud) 我在从jQuery转换几年后学习AngularJS.有些位更加直观.有些不是很多:).
我试图了解承诺的使用,特别是使用$ http的$ q,并且似乎没有太多关于这两个组合的信息,我可以找到.
为什么我会使用promises代替成功/错误回调?他们都在现实中使用回调,那么为什么承诺会更好?我可以设置get(...)如下函数:
function get(url, success, error) {
success = success || function () {};
error = error || function () {};
$http.get(url)
.success(function (data) {
success(data);
})
.error(function (error) {
error(error);
});
}
get('http://myservice.com/JSON/',
function () {
// do something with data
},
function () {
// display an error
}
);
Run Code Online (Sandbox Code Playgroud)
哪个好(?)因为它让我可以完全控制正在发生的事情.如果我打电话,get(...)那么我可以在任何地方控制任何成功/错误get.
如果我将其转换为使用promises,那么我得到:
function get(url) {
return $http.get(url)
.then(function (data) {
return data;
},
function (error) {
return error;
}); …Run Code Online (Sandbox Code Playgroud)