Angular无法解决承诺

时间:2016-08-26 08:20:13

标签: angularjs http angular-promise angular-services

我创建了一个通过$ 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(){},我收到以下错误: enter image description here

任何人都可以解释为什么会这样吗?

4 个答案:

答案 0 :(得分:0)

试试这个:

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

答案 1 :(得分:0)

我找到了解决方案。只需要将已解决的promise分配给变量然后返回该变量。

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

答案 2 :(得分:0)

您无需在此处使用find3。有一些角度服务会返回$q,例如$promise。因此,您不应在此处使用$http,$timeout,$interval,因为$q服务已经提交了承诺 您的服务应如下所示:

$http

此时您已经有.factory('myService', function($http) { return { postMyData : function(){ return $http.post(data); } 角度服务返回的承诺。现在你可以根据需要解决它(控制器) 例如:

$http

答案 3 :(得分:0)

如果您致电userService.postUser($scope.user).then(){}userService中的功能应返回承诺:

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