AngularJS工厂返回类型未定义

AngularJS Factory return type undefined

本文关键字:未定义 返回类型 工厂 AngularJS      更新时间:2023-09-26

我试图将数据存储在angularjs工厂内的数据库中,这对我来说很有效。在Parse中存储数据后,我试图返回1或错误对象(取决于存储是否有效),然后在控制器中处理。

在控制器中,当我检查返回值时,它既不是1也不是错误,而是未定义的。

这是我的密码。。。

控制器呼叫服务:

$scope.signup = function(user, $state) {
        if(user !== null)
        {
            var returnValue = CreateUserService.createAccount(user); 
            console.log("Return Value = " + returnValue);
            if(returnValue === 1)
            {
                $state.go('activate');   
            }else{
                console.log("Return Value was not appropriate");   
            }
        }else{
            console.log("Something went wrong while adding user");   
        }
    };

工厂:

.factory('CreateUserService', function() {
    return {
      createAccount: function(user) {
          var parseUser = new Parse.User();
          parseUser.set("username", user.username);
          parseUser.set("email", user.email);
          parseUser.set("name", user.name);
          parseUser.set("password", user.password);
          parseUser.set("mobile", user.mobile);
          /*Attempt to create user in DB*/
          parseUser.signUp(null, {
            success: function(parseUser) {
              // Hooray! Let them use the app now.
              //alert("success!");
              console.log("Stored");
                return 1;
            },
            error: function(parseUser, error) {
              // Show the error message somewhere and let the user try again.
              //alert("Error: " + error.code + " " + error.message);
              console.log("Error: " + error.message );    
              return error;
            }
          });
      }
    }
}

谢谢你帮忙。

实际上并不是从createAccount函数返回,而是从回调返回。回调也是asynchronous,因此它将在完成请求之前返回。

.factory('CreateUserService', function($q) {
    return {
      createAccount: function(user) {
          var deferred = $q.defer();
          var parseUser = new Parse.User();
          parseUser.set("username", user.username);
          parseUser.set("email", user.email);
          parseUser.set("name", user.name);
          parseUser.set("password", user.password);
          parseUser.set("mobile", user.mobile);
          /*Attempt to create user in DB*/
          parseUser.signUp(null, {
            success: function(parseUser) {
              // Hooray! Let them use the app now.
              //alert("success!");
              console.log("Stored");
              deferred.resolve(1);
            },
            error: function(parseUser, error) {
              // Show the error message somewhere and let the user try again.
              //alert("Error: " + error.code + " " + error.message);
              console.log("Error: " + error.message );    
              deferred.reject(error);
            }
          });
          return deferred.promise;
      }
    }
}

然后在控制器中使用服务功能作为承诺。

CreateUserService.createAccount(user).then(function(result) { 
   // result should be whatever passed in to resolve
}, function(error) {
  // error here will be whatever passed into reject
});

了解有关承诺的更多信息:https://docs.angularjs.org/api/ng/service/$q

我认为问题是因为您的ajax调用异步调用。当您调用"CreateUserService.createAccount(user)"时,它依次调用异步的ajax调用parseUser.signUp。

.factory('CreateUserService', function($q) {
return {
  createAccount: function(user) {
      var parseUser = new Parse.User();
      parseUser.set("username", user.username);
      parseUser.set("email", user.email);
      parseUser.set("name", user.name);
      parseUser.set("password", user.password);
      parseUser.set("mobile", user.mobile);
      var deferred = $q.defer();  
      /*Attempt to create user in DB*/
      parseUser.signUp(null, {
        success: function(parseUser) {
          // Hooray! Let them use the app now.
          //alert("success!");
          console.log("Stored");
           // return 1;
           deferred.resolve(data);
        },
        error: function(parseUser, error) {
          // Show the error message somewhere and let the user try again.
          //alert("Error: " + error.code + " " + error.message);
          console.log("Error: " + error.message );    
          //return error;
          return deferred.resolve("Error while saving");
        }
      });
      return deferred.promise;
     }
   }
 }

也可以使用此更改控制器$scope.signup=函数(用户,$state){

    if(user !== null)
    {
        var promise = CreateUserService.createAccount(user);
            promise.then(function(data) {
            $state.go('activate');
          },
          function(data) {
            console.log("Return Value was not appropriate");   
        });
    }else{
        console.log("Something went wrong while adding user");   
    }
};

这可能会解决

问题

问题是您正在从一步深的回调返回,因此您需要某种回调或angularJS的$q服务

类似的问题:如何从异步回调函数返回值?

 $scope.signup = function(user, $state) {
    if(user !== null)
    {
        // notice the callback function passed below
        CreateUserService.createAccount(user, function(returnValue){
            // returnValue in available here for use
            console.log("Return Value = " + returnValue);
            if(returnValue === 1)
            {
                $state.go('activate');   
            }else{
                console.log("Return Value was not appropriate");   
            }
        });
    }else{
        console.log("Something went wrong while adding user");   
    }
};

工厂:

    .factory('CreateUserService', function() {
    return {
      createAccount: function(user, done) {
         // done callback function in the param to be called for returning the values 
          var parseUser = new Parse.User();
          parseUser.set("username", user.username);
          parseUser.set("email", user.email);
          parseUser.set("name", user.name);
          parseUser.set("password", user.password);
          parseUser.set("mobile", user.mobile);
          /*Attempt to create user in DB*/
          parseUser.signUp(null, {
            success: function(parseUser) {
              // Hooray! Let them use the app now.
              //alert("success!");
              console.log("Stored");
              // call the done/callback here for success
                done(1);
            },
            error: function(parseUser, error) {
              // Show the error message somewhere and let the user try again.
              //alert("Error: " + error.code + " " + error.message);
              console.log("Error: " + error.message );    
              // call the done/callback here for error
              done(error);
            }
          });
      }
    }
}