如果服务暴露自己的不同步?

编程入门 行业动态 更新时间:2024-10-24 02:29:23
本文介绍了如果服务暴露自己的不同步?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在写一个服务,将异步检索数据($ HTTP或$资源)。我可以隐藏的事实,它是通过返回一个数组,最初是空的异步的,但最终会填充:

I'm writing a service that will retrieve data asynchronously ($http or $resource). I can hide the fact that it is asynchronous by returning an array that will initially be empty, but that will eventually get populated:

.factory('NewsfeedService1', ['$http', function($http) { var posts = []; var server_queried = false; return { posts: function() { if(!server_queried) { $http.get('json1.txt').success( function(data) { server_queried = true; angular.copy(data, posts); }); } return posts; } }; }]) .controller('Ctrl1', ['$scope','NewsfeedService1', function($scope, NewsfeedService1) { $scope.posts = NewsfeedService1.posts(); }])

或者,我可以通过返回的承诺揭露异步性:

Or I can expose the asynchronicity by returning a promise:

.factory('NewsfeedService2', ['$http', function($http) { var posts = []; var server_queried = false; var promise; return { posts_async: function() { if(!promise || !server_queried) { promise = $http.get('json2.txt').then( function(response) { server_queried = true; posts = response.data; return posts; }); } return promise; } }; }]) .controller('Ctrl2', ['$scope','NewsfeedService2', function($scope, NewsfeedService2) { NewsfeedService2.posts_async().then( function(posts) { $scope.posts = posts; }); // or take advantage of the fact that $q promises are // recognized by Angular's templating engine: // (note that Peter and Pawel's AngularJS book recommends against this, p. 100) $scope.posts2 = NewsfeedService2.posts_async(); }]);

( Plunker - 如果有人想玩弄上述两种实现)

(Plunker - if someone wants to play around with the above two implementations.)

露出的异步性会增加一个错误处理程序的则()的方法,我可以处理控制器错误的一个潜在优势。不过,我很可能会再追和$ HTTP错误在处理应用程序范围的拦截。

One potential advantage of exposing the asychronicity would be that I can deal with errors in the controller by adding an error handler to the then() method. However, I'll likely be catching and dealing with $http errors in an application-wide interceptor.

所以,当要服务的异步性暴露?

So, when should a service's asynchronicity be exposed?

推荐答案

我的猜测是,你会发现人们对这个栅栏的两侧。的个人的,我觉得你应该总是暴露的库或函数的异步性(或更正确:我觉得你应该的从不掩饰的库或函数的异步性) 。主要的原因是透明度;例如,将这项工作?

My guess is that you'll find people on both sides of this fence. Personally, I feel that you should always expose the asynchronicity of a library or function (or more correctly: I feel that you should never hide the asynchronicity of a library or function). The main reason is transparency; for example, will this work?

app.controller('MyController', function(NewsfeedService) { $scope.posts = NewsfeedService.posts(); doSomethingWithPosts($scope.posts); // <-- will this work? });

如果你使用第一种方法(例如: $资源),它不会,即使 $ scope.posts 在技术上是一个数组。如果 doSomethingWithPosts 都有自己的异步操作,你可以用一个竞争条件结束。相反,你无论如何都要使用异步code:

If you're using the first method (e.g. $resource), it won't, even though $scope.posts is technically an array. If doSomethingWithPosts has its own asynchronous operations, you could end up with a race condition. Instead, you have to use asynchronous code anyway:

app.controller('MyController', function(NewsfeedService) { $scope.posts = NewsfeedService.posts(function() { doSomethingWithPosts($scope.posts); }); });

(当然,你可以回调接受帖子作为参数,但我仍然认为这是混乱和不规范。)

(Of course, you can make the callback accept the posts as an argument, but I still think it's confusing and non-standard.)

幸运的是,我们有承诺,承诺的目的就是要的再present 的操作的未来价值。此外,由于与承诺角的 $ Q 库创建可以绑定到的意见,有没有错:

Luckily, we have promises, and the very purpose of a promise is to represent the future value of an operation. Furthermore, since promises created with Angular's $q libraries can be bound to views, there's nothing wrong with this:

app.controller('MyController', function(NewsfeedService) { $scope.posts = NewsfeedService.posts(); // $scope.posts is a promise, but when it resolves // the AngularJS view will work as intended. });

[更新:你不能再直接绑定承诺的观点;你必须等待承诺解决,手动分配scope属性]

[Update: you can no longer bind promises directly to the view; you must wait for the promise to be resolved and assign a scope property manually.]

顺便说一句, Restangular ,一个流行的替代 $资源,使用承诺,AngularJS自己的 $资源将在1.2支持他们(它们可能已经支持他们最新的1.1.x版本的)。

As an aside, Restangular, a popular alternative to $resource, uses promises, and AngularJS' own $resource will be supporting them in 1.2 (they may already support them in the latest 1.1.x's).

更多推荐

如果服务暴露自己的不同步?

本文发布于:2023-10-26 19:04:48,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1531075.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:自己的   不同步

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!