为什么在 Angular 服务中使用 $http 时 return 承诺和数据?
Why return the promise and the data when using $http in an Angular service?
我经常在网上看到有关 Angular 服务的教程和片段,这些服务使 $http 调用 return $http 承诺和一些数据。如果承诺 returned 到控制器,returning 服务中的数据有什么意义?我什至不明白它在哪里 returned。这是我的意思的一个例子:
// 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);
});
}
并让控制器从 returned 承诺中获取数据?我觉得我不明白这里的东西。非常感谢任何帮助。
.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`
}
通常情况下,如果您需要在将数据发送到控制器之前进行一些处理,您会这样做。
但在这种情况下,我同意,因为没有数据处理,不需要解决服务中的承诺。
在这种情况下,我会简单地将服务方法重写为:-
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;
}
您参考的教程没有 return success 处理程序中的数据,它 returns result.data then 处理程序中的数据。然后,生成一个新的链式承诺,然后 returned。这将删除通常存在于 .then.
中的 http 请求数据
何必呢?
使用 .then 而不是 .success 的原因是为了将来的验证。 .success 不是承诺的一部分,它特定于 $http。如果您以后决定从另一个异步源(websockets、webworkers)获取数据,那么当您 return 的承诺不再有成功处理程序时,您的代码将会中断。
通过使其始终 return a .then,您可以确保您的服务足够抽象。
我经常在网上看到有关 Angular 服务的教程和片段,这些服务使 $http 调用 return $http 承诺和一些数据。如果承诺 returned 到控制器,returning 服务中的数据有什么意义?我什至不明白它在哪里 returned。这是我的意思的一个例子:
// 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);
});
}
并让控制器从 returned 承诺中获取数据?我觉得我不明白这里的东西。非常感谢任何帮助。
.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`
}
通常情况下,如果您需要在将数据发送到控制器之前进行一些处理,您会这样做。
但在这种情况下,我同意,因为没有数据处理,不需要解决服务中的承诺。
在这种情况下,我会简单地将服务方法重写为:-
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;
}
您参考的教程没有 return success 处理程序中的数据,它 returns result.data then 处理程序中的数据。然后,生成一个新的链式承诺,然后 returned。这将删除通常存在于 .then.
中的 http 请求数据何必呢?
使用 .then 而不是 .success 的原因是为了将来的验证。 .success 不是承诺的一部分,它特定于 $http。如果您以后决定从另一个异步源(websockets、webworkers)获取数据,那么当您 return 的承诺不再有成功处理程序时,您的代码将会中断。
通过使其始终 return a .then,您可以确保您的服务足够抽象。