Javascript 在Angular服务中使用$http时,为什么要返回承诺和数据?

Javascript 在Angular服务中使用$http时,为什么要返回承诺和数据?,javascript,angularjs,angular-promise,angularjs-http,Javascript,Angularjs,Angular Promise,Angularjs Http,我经常在网上看到有关Angular services的教程和代码片段,这些教程和代码片段用于进行$http调用,以返回$http承诺和一些数据。如果承诺返回给控制器,那么返回服务中的数据有什么意义?我甚至不知道它在哪里被退回。这里有一个例子来说明我的意思: // Function of MyStuffService: function getStuff() { return $http.get('/api/stuff') .success(function(data)

我经常在网上看到有关Angular services的教程和代码片段,这些教程和代码片段用于进行$http调用,以返回$http承诺和一些数据。如果承诺返回给控制器,那么返回服务中的数据有什么意义?我甚至不知道它在哪里被退回。这里有一个例子来说明我的意思:

 // 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);
        });
}

让控制器从返回的承诺中获取数据?我觉得我不明白这里有什么。非常感谢您的帮助。

中返回的数据。然后,
可供下一个链接的
处理程序使用。然后,
处理程序将最终用于获取数据

.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`
}

.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;
}

通常情况下,若在向控制器发送数据之前需要进行一些处理,您会这样做

但在这种情况下,我同意,因为没有数据处理,所以不需要解决服务中的承诺

在这种情况下,我只需将服务方法重写为:-

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;
}

您参考的教程不会在成功处理程序中返回数据,而是在then处理程序中返回result.data。然后,生成一个新的链式承诺的信息被返回。这将删除中通常存在的http请求数据。然后

为什么要麻烦? 与…合作的理由。那么,成功是为了证明未来。成功不是承诺的一部分,它是特定于$http的。如果您决定以后从另一个异步源(websockets、webworkers)获取数据,那么当您返回的承诺不再具有成功处理程序时,您的代码将被破坏


通过使其始终返回a。然后,您可以确保您的服务得到充分抽象。

您参考的教程没有在成功处理程序中返回数据,而是在随后的处理程序中返回result.data。然后,生成一个新的链式承诺的信息被返回。这将删除中通常存在的http请求数据。然后

为什么要麻烦? 与…合作的理由。那么,成功是为了证明未来。成功不是承诺的一部分,它是特定于$http的。如果您决定以后从另一个异步源(websockets、webworkers)获取数据,那么当您返回的承诺不再具有成功处理程序时,您的代码将被破坏


通过使其始终返回a。然后,您可以确保您的服务得到充分的抽象。

您参考了哪些教程和哪些片段?。。在成功回调中返回数据肯定很奇怪。这里有一条关于Angular的旧版本的评论,但我认为第一部分还可以。所以我应该避免这种模式?在我的服务中只执行
函数getStuff(){return$http.get('/api/stuff');}
是可以的。。我认为这很好。@Klodo:这个答案没有使用
成功
,而是使用
然后
,从中你确实可以
返回
。不可否认,标识函数作为回调没有多大意义。@Bergi:我明白了,谢谢。我想你应该去读一下成功/错误和失败之间的区别。我认为成功只是语法上的糖分,它有四个参数(
data、status、headers、config
),而不仅仅是
result
。谢谢你的帮助。你指的是什么教程和什么片段?。。在成功回调中返回数据肯定很奇怪。这里有一条关于Angular的旧版本的评论,但我认为第一部分还可以。所以我应该避免这种模式?在我的服务中只执行
函数getStuff(){return$http.get('/api/stuff');}
是可以的。。我认为这很好。@Klodo:这个答案没有使用
成功
,而是使用
然后
,从中你确实可以
返回
。不可否认,标识函数作为回调没有多大意义。@Bergi:我明白了,谢谢。我想你应该去读一下成功/错误和失败之间的区别。我认为成功只是语法上的糖分,它有四个参数(
data、status、headers、config
),而不仅仅是
result
。谢谢您的帮助。您是否检查了
成功
是否像
然后
那样工作?我很肯定会有相反的结果,但成功并不会带来新的承诺,这一点可以从以下事实中得到证明:您可以在之后使用chained.error方法。事实上,从它的回调返回是没有意义的。@Bergi,啊,真的。。。我错过了。从
.success
返回是毫无意义的-它只是传递了原始的
$http
承诺。修正了。我认为上面的代码有一个小错误。
then
函数应该有一个
结果
参数,而不是
数据
,因为它不是e