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

Why return the promise and the data when using $http in an Angular service?

本文关键字:为什么 返回 promise 数据 http 服务 Angular      更新时间:2024-05-30

我经常在网上看到关于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;
}