При использовании 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
, который идет, чтобы показать, что порядок исполнения отличается от того, что я ожидал. Я знаю, что речь идет о асинхронном поведении и функции обратного вызова, но я действительно не знаю, как это исправить. Я продолжаю сталкиваться с этой проблемой, и было бы очень признательно, если бы кто-нибудь мог показать мне, как бороться с этим типом ситуации.
Я бы предложил читать о обещаниях в [$ HTTP] (http://docs.angularjs.org/api/ng.$http) и $ кв. – calebboyd