正在筛选回调函数中的数据
Filtering data from callback function
在使用AngularJS时,我一直遇到如何处理异步行为和回调函数的问题。在下面,我如何修改PostsService.getPostBySlug
以返回所需的帖子?
张贴服务
Website.factory( 'PostsService',
[ '$filter', '$http', function( filter, $http )
{
// declare service
var PostsService = {};
返回所有帖子(读取posts.json)
PostsService.getPosts = function( callback )
{
$http
.get( 'posts/posts.json' )
.success( callback );
}
返回一个基于其碎片的帖子
PostsService.getPostBySlug = function( slug, callback )
{
// declare post
var postForSlug = null;
console.log( postForSlug ); // prints 'null'
// get all posts from service
var posts = PostsService.getPosts( function( data )
{
// all posts
var posts = data;
console.log( posts ); // prints array of objects
// return all posts
return posts;
});
// filter by slug
postForSlug = filter( 'filter' )
(
posts,
{
'slug': slug
}
);
console.log( postForSlug ); // prints 'undefined'
// return post for the given slug
return postForSlug;
}
退货服务
// return service
return PostsService;
}]);
输出为
null BlogController.js:26
undefined BlogController.js:51
[Object, Object] BlogController.js:33
这表明执行的顺序与我预期的不同。我知道这是关于异步行为和回调函数的,但我真的不知道如何解决它。我一直遇到这个问题,如果有人能告诉我如何处理这种情况,我将不胜感激。
同时,以下是我要做的。
WebSite.controller('BlogController',function(PostsService,$scope){
PostService.getPosts()
.then(function(posts){
$scope.posts = posts;
});
PostService.getPostBySlug()
.then(function(post){
$scope.postBySlug = post;
});
});
你的PostsService
看起来是这样的:(一个被锁住的承诺!)
PostsService.getPosts = function()
{
return $http.get('posts/posts.json').then(function(response){
var data = response.data;
//look it over, is it what you want?
return data;
},function(errResponse){
//handle error.
});
}
至于过滤器。它们是使用|
操作符在视图中应用的,在视图中具有所需的参数,在模板之外它们根本没有用处。
所以你的getPostsBySlug
应该是这样的:
PostsService.getPostBySlug = function( slug )
{
return this.getPosts().then(function(posts){
var post = {};
angular.forEach(posts,function(value,index){
if(value.slug == slug){
post = value;
}
});
return post;
});
}
希望这能有所帮助!
我会使用promise和$q promise Api来实现这一点。
参见http://jsfiddle.net/6WuM3/
module.factory('PostsService', ['$filter', '$http', '$q', function (filter, $http, $q) {
// declare service
var PostsService = {};
PostsService.getPosts = function () {
var defered = $q.defer();
$http.get('posts/posts.json').then(function(response){
defered.resolve(response.data);
});
return defered.promise;
}
PostsService.getPostBySlug = function (slug) {
var defered = $q.defer();
PostsService.getPosts().then(function(posts){
var filtered = filter('filter')(posts, {
'slug': slug
});
defered.resolve(filtered);
});
return defered.promise;
}
return PostsService;
}])
关于:)
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 如何将firebase数据传递到函数中
- 为什么不'我们在javascript中使用函数参数的数据类型
- Meteor Router数据函数被调用两次
- onChange 函数更改表中显示的数据
- 如何降低此函数的复杂性,该函数根据数据类型进行回调
- 函数jquery.html()不提供数据属性集值
- javascript函数将数据添加到屏幕,但随后被另一个函数覆盖
- 从AJAX回调函数中分离数据
- 如何在从客户端接收数据时从本机方法触发javascript函数?
- 在p:dataScroller中添加的数据丢失了Javascript函数
- 为什么在调用父构造函数时在[]中发送数据
- 在javascript中调用函数/对象引用时,可容纳任何数据类型
- 表单中的数据不会传递给提交函数-使用Angular
- 如何拦截 jQuery Datatables 搜索函数以在搜索之前重新加载数据(函数的名称是什么)
- Jquery Html数据函数
- JQuery数据函数返回错误的值
- 如何保持数据函数和变量DRY
- 用Angular Bootstrap Calendar传递额外的数据给单元格数据函数
- 若忽略语句,则映射API存储数据函数