Javascript 角http

Javascript 角http,javascript,angularjs,Javascript,Angularjs,我有一个请求功能: function search(request) { return $http.post('/path/to/resource', request); } 我可以这样称呼它: search({/*...*/}) .success(function() {}) .error(function() {}) searchById().then(successCallback, errorCallback); searchById() .success(suc

我有一个请求功能:

function search(request) {
    return $http.post('/path/to/resource', request);
}
我可以这样称呼它:

search({/*...*/})
  .success(function() {})
  .error(function() {})
searchById().then(successCallback, errorCallback);
searchById()
 .success(successCallback)
 .error(errorCallback);
由于我经常需要通过ID查找某些对象,因此我需要一个快捷功能。我找不到如何创建此函数,以便还可以将其与
success()
error()
函数链接

我搜索了如何在angular中创建承诺,并找到了,这就是我尝试的:

function searchById(id) {
  var deferred = $q.defer();
  search({id: id}).
    then(function (response) {
      deferred.resolve(response.data.results[0]);
    }, function (error) {
      deferred.reject(error);
    });
    return deferred.promise;
}
我只能这样称呼它:

search({/*...*/})
  .success(function() {})
  .error(function() {})
searchById().then(successCallback, errorCallback);
searchById()
 .success(successCallback)
 .error(errorCallback);
我想这样称呼它:

search({/*...*/})
  .success(function() {})
  .error(function() {})
searchById().then(successCallback, errorCallback);
searchById()
 .success(successCallback)
 .error(errorCallback);
关于
$q
的文档表明它返回一个
promise
,而关于
$http
的文档表明它返回一个
httpPromise
,但我不知道如何创建
httpPromise


有什么想法吗?

在示例中,错误回调应该是catch而不是error,试试这个

searchById()
 .then(successCallback)
 .catch(errorCallback);
sjokkogutten是正确的,您不需要使用$q。在这种情况下,您可以简化它

  var deferred = $q.defer();
  search({id: id}).
    then(function (response) {
      deferred.resolve(response.data.results[0]);
    }, function (error) {
      deferred.reject(error);
    });
    return deferred.promise;
对此

return search({id: id}).
  then(function (response) {
  return response.data.results[0];
  }

在示例中,错误回调应该是catch而不是error,请尝试以下操作

searchById()
 .then(successCallback)
 .catch(errorCallback);
sjokkogutten是正确的,您不需要使用$q。在这种情况下,您可以简化它

  var deferred = $q.defer();
  search({id: id}).
    then(function (response) {
      deferred.resolve(response.data.results[0]);
    }, function (error) {
      deferred.reject(error);
    });
    return deferred.promise;
对此

return search({id: id}).
  then(function (response) {
  return response.data.results[0];
  }

$http
已返回承诺,因此无需使用
$q.defer()
。此外,
success()
error()
已经贬值(从1.4.4开始),您应该使用
then()

按如下方式调用函数:

search(request).then(function(data){
  // successcallback
}, function(error){
  // errorcallback
})

$http
已返回承诺,因此无需使用
$q.defer()
。此外,
success()
error()
已经贬值(从1.4.4开始),您应该使用
then()

按如下方式调用函数:

search(request).then(function(data){
  // successcallback
}, function(error){
  // errorcallback
})

下面是一个实际的例子:

app.controller('controller',function($scope,$rootScope,$http,){
    $scope.login = function(request){
        var promise = $http.post(/path/to/resource, request, {
            headers: {
                'Content-Type': 'application/json'
            }
        }).then(function success(res){

                //it worked, you have data in res

        },function error(res){
            // it failed
        });
    };
});

下面是一个实际的例子:

app.controller('controller',function($scope,$rootScope,$http,){
    $scope.login = function(request){
        var promise = $http.post(/path/to/resource, request, {
            headers: {
                'Content-Type': 'application/json'
            }
        }).then(function success(res){

                //it worked, you have data in res

        },function error(res){
            // it failed
        });
    };
});

使用$http函数创建工厂将允许您使用
.success
.error
。但是你真的应该使用
。然后

app.factory("dataService", function($http) {
    return {
        search: function() {
            return $http.get('path/to/api');
        },
        searchById: function(payload) {
            return $http.post('path/to/api', payload);
        },
        searchMoreThings: function(payload) {
            if(payload === "foo") payload = "bar";

            return $http.post('path/to/api', payload);
        }
    }
});
你可以做:

dataService.searchById(searchTerm).success().error();

使用$http函数创建工厂将允许您使用
.success
.error
。但是你真的应该使用
。然后

app.factory("dataService", function($http) {
    return {
        search: function() {
            return $http.get('path/to/api');
        },
        searchById: function(payload) {
            return $http.post('path/to/api', payload);
        },
        searchMoreThings: function(payload) {
            if(payload === "foo") payload = "bar";

            return $http.post('path/to/api', payload);
        }
    }
});
你可以做:

dataService.searchById(searchTerm).success().error();

.success
和.
error
已被弃用。您应该使用标准的
。然后改为
。$http服务和$q使用了受Kris Kowal的q启发的相同类型的承诺。
。success
和。
error
被弃用。您应该使用标准的
。然后改为使用
。$http服务和$q使用的承诺类型与Kris Kowal的q所启发的承诺类型相同。对于成功/错误否决,我不会使用它。有一点不清楚,那就是我的问题:在将结果发送到“success”回调之前,我还想对结果进行一些中间计算(在这里我调用
deferred.resolve(response.data.results[0]);
)。我可以在不创建新承诺的情况下包含此计算吗?为什么需要在成功回调之前进行计算?您不能从回调本身内部执行吗?i、 e.
dataService.searchById(searchTerm).then(函数(响应){/*对response.data*/},函数(响应){/*error*/})确定成功/错误弃用,我将不使用它。有一点不清楚,那就是我的问题:在将结果发送到“success”回调之前,我还想对结果进行一些中间计算(在这里我调用
deferred.resolve(response.data.results[0]);
)。我可以在不创建新承诺的情况下包含此计算吗?为什么需要在成功回调之前进行计算?您不能从回调本身内部执行吗?i、 e.
dataService.searchById(searchTerm).then(函数(响应){/*对response.data*/},函数(响应){/*error*/})
而不是
then(success,error)
,最好使用
。then(…).catch(…)
。而不是
then(success,error)
,最好使用
。then(…).catch(…)