簡體   English   中英

AngularJS Factory返回類型未定義

[英]AngularJS Factory return type undefined

我正在嘗試將數據存儲在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 = function(user,$ 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);

            }
          });
      }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM