Angular 无法解决承诺

Angular cannot resolve promise

我创建了一个通过 $http.post.

与服务器通信的服务
app.factory("dataService", [
    "$http", "$q", "$timeout", function ($http, $q) {

        function post(url, data) {
            var deferred = $q.defer();
            $http.post(url, data)
            .success(function (result) {
                deferred.resolve(result);
            })
            .error(function (error) {
                deferred.reject(error);
            });
            return deferred.promise;
        }

        return {
            post: post
        };

在我正在做的控制器中:

dataService.get(someUrl,someData).
  then(function (data) {
     $scope.result = data;
 });

一切正常,但如果我在其他服务中调用这个通用 "dataService",例如:

 app.factory("userService", ["$http", "$q","dataService", function ($http, $q,dataService) {

        function postUser(user) {
            dataService.post(usersUrl, user);
        }

        return {
            postUser: postUser
        };
    }

并在控制器中调用此 "userService" userService.postUser($scope.user).then(){},我收到以下错误:

谁能解释一下为什么会这样?

试试这个:

app.factory("dataService", [
              "$http", "$timeout", function ($http) {

                function post(url, data) {
                  return new Promise(function(resolve, reject) {
                    $http.post(url, data)
                      .success(function (result) {
                        resolve(result)
                      })
                      .error(function (error) {
                        resolve(error)
                      });
                  });
                }
                return {
                  post: post
                };

app.factory("userService", ["$http", "$q","dataService", function ($http, $q,dataService) {

              function postUser(user) {
                return dataService.post(usersUrl, user);
              }

              // OR

              function postUser(user,callback) {
                dataService.post(usersUrl, user).then(function(data){callback(data);});
              }

              return {
                postUser: postUser
              };
            }

希望对您有所帮助 ;)

More info here

我找到了解决办法。只需要将已解决的承诺分配给变量,然后 return 该变量。

   function postUser(user) {
            var result = dataService.post(usersUrl,user);
            return result;
        };

您不需要使用 $q here.There 有一些 angular 服务 return 和 $promise,例如 $http,$timeout,$interval.因此,您不应在此处使用 $q,因为承诺已被 $http 服务 return 编辑。
您的服务应如下所示:

.factory('myService', function($http) {
       return {
        postMyData : function(){
        return $http.post(data);
 }

此时您已经有了 return 由 $http angular 服务编辑的承诺。现在你可以随心所欲地解决它( controller )。
例如:

var myPromise = myService.postMyData(data).
        myPromise.then(function(){//success
                  },function(){//error
                  },function(){//inform that action is in progress
        })

如果您调用 userService.postUser($scope.user).then(){} userService 中的函数,应该 return 承诺:

 function postUser(user) {
   return dataService.post(usersUrl, user);
 }