在Angular服务中使用$http时,为什么要返回promise和数据
Why return the promise and the data when using $http in an Angular service?
我经常在网上看到关于Angular服务的教程和片段,这些服务可以进行$http调用,同时返回$http承诺和一些数据。如果promise返回给控制器,那么返回服务中的数据有什么意义?我甚至不知道它被退回到哪里。下面是我的意思的一个例子:
// Function of MyStuffService:
function getStuff() {
return $http.get('/api/stuff')
.success(function(data) {
// Why return data here? How could I even get this returned value?
return data;
})
.error(function(data) {
console.error(data);
});
}
// Controller:
function getStuff() {
MyStuffService.getStuff()
.success(function(data) {
$scope.stuff = data;
})
}
我不能把我的服务功能重写为:吗
// Function of MyStuffService:
function getStuff() {
return $http.get('/api/stuff')
.error(function(data) {
console.error(data);
});
}
让控制器从返回的promise中获取数据?我觉得我不明白什么。非常感谢您的帮助。
.then
中返回的数据可用于下一个链接的.then
处理程序,这是您最终用来获取数据的处理程序。
.success
只是传递了$http.get
最初的承诺。从.success
返回数据没有任何作用。
所以,如果你有:
function getStuff() {
return $http.get('/api/stuff')
.success(function(data) {
// do something with data. returning doesn't do anything
})
.error(function(data) {
console.error(data);
});
};
在控制器中你会做:
getStuff().then(function(response){
$scope.data = response.data; // this is the data available from `$http.get`
}
您所引用的教程不会在success处理程序中返回数据,而是在then处理程序中输出result.data。然后,它生成一个新的链式承诺,然后返回。这将删除通常存在于.then.中的http请求数据
为什么要麻烦
与…合作而不是成功的原因是为了经得起未来的考验。成功不是承诺的一部分,它是$http特有的。如果您以后决定从另一个异步源(websockets、webworkers)获取数据,那么当您返回的承诺不再有成功处理程序时,您的代码就会崩溃。
通过使它总是返回一个.然后,您可以确保您的服务是充分抽象的。
通常情况下,如果您需要在向控制器发送数据之前进行一些处理,您会这样做。
但在这种情况下,我同意,因为没有数据处理,所以没有必要解决服务中的承诺。
在这种情况下,我只需将服务方法重写为:-
function getStuff() {
return $http.get('/api/stuff');
}
如果在将数据返回到控制器之前必须进行一些处理,我倾向于使用$q,如下所示。
function getStuff() {
var defer = $q.defer();
$http.get('/api/stuff')
.then(function(data) {
// some processing
defer.resolve(processedData);
}, function(error) {
defer.reject(error);
});
return defer.promise;
}
相关文章:
- 为什么返回'原因'来自被拒绝的jQueryAJAX调用theable
- 为什么返回文档.getElementsByClassName正在工作,而getElementbyId不在Watir中
- 为什么返回此结果会导致对象
- 为什么返回 false 不适用于 AddEventListener,以及 Javascript 对 preventDef
- 为什么返回的 Promise 在登录到控制台时没有方法
- 为什么返回在getJSON中不起作用,为什么我不能从getJSON写入变量
- 为什么返回 false 会停止使用 jQuery 传播,而使用 POJS 则不会
- 为什么“1”--“1”返回2
- 为什么返回错误不会阻止我的表单提交
- 为什么返回 document.getElementById 不起作用
- 为什么返回未定义
- 为什么返回调试器在javascript中失败
- 以下Javascript语句返回什么以及为什么返回
- 为什么[]+[]返回一个空字符串
- 当属性src为null或为空时,.prp('src')为什么返回错误的值
- 为什么返回0
- JS:为什么(![]+[])[+[]]返回"f"
- 为什么返回这个ECMAScript Harmony箭头函数表达式会产生意想不到的行为?
- 为什么x &&返回的无效
- 为什么返回对象的 JavaScript 函数通过引用(对其参数)来执行此操作