Angular的$ http post方法

时间:2014-10-26 07:34:14

标签: ruby-on-rails angularjs http heroku

所以我的应用程序中有以下方法:

self.addUser = function() {
  var errCode;
  $http.post('users/add', {username: self.username, password: self.password}).
    success(function(data, status, headers, config) {
      // this callback will be called asynchronously
      // when the response is available
      var errCode = data.errCode;
      if(errCode == -2) {
        alert("Error: This username already exists.");
      }
      else if(errCode == -3) {
        alert("Error: The username is empty, too long, or has invalid characters.");
      }
      else if(errCode == -4) {
        alert("Error: The password is empty, too long, or has invalid characters.");
      }
      else {
        alert("User created.");                     
      }
      console.log(errCode);
      return errCode;
    }).
    error(function(data, status, headers, config) {
      // called asynchronously if an error occurs
      // or server returns response with an error status.
      alert("Error.");
    });
    console.log(self.username);
  }

我们的后端设置为返回一个JSON对象data,其中包含一个成功保存时等于1的errCode(以及其他内容),并且出现负数。

我的目标是让errCode超出此功能。

看来$ http里面的函数有自己的作用域,我找不到在这个函数之外得到errCode的方法,例如,我在函数外部声明一个$ scope变量并尝试更新它在功能里面。我该怎么做?

编辑:我还没有解决问题,但是让我失望的问题是我忘记了这是异步工作的(Mukund和isim都详细说明了这一点)。

编辑:回答

2 个答案:

答案 0 :(得分:2)

当$ http返回一个promise时,我建议你将这个promise返回给addUser的调用者。 你可以像这样定义它;

addUser: function() {
     var promise = $http.post(......).then(function(response) {
          //error handling and stuff
          //return the data
          return response.data.errCode;
     });

     //return the promise to the caller
     return promise;
}

然后在使用它的代码中,您可以继续嵌套then以执行您需要的操作。

//somewhere in your controller
someObject.addUser().then(function(errCode) {
     //do something with the error
});

另一种方法是将回调作为参数发送到addUser函数:

addUser: function(callback) {
     $http.post(......).then(function(response) {
          //error handling and stuff
          //return the data
          callback(response.data.errCode);
     });
}

//in your controller
someObject.addUser(function(errorCode){
    //do something with errCode
});

但我认为第一种方法更清洁

答案 1 :(得分:0)

使用以下代码替换上面的代码:

self.addUser = function() {
        var errCode;
        $http.post('users/add', {username: self.username, password: self.password}).
            success(function(data, status, headers, config) {
            // this callback will be called asynchronously
            // when the response is available
                var errCode = data.errCode;
                self.retrieveErrCode(errCode);
                if(errCode == -2) {
                    alert("Error: This username already exists.");
                }
                else if(errCode == -3) {
                    alert("Error: The username is empty, too long, or has invalid characters.");
                }
                else if(errCode == -4) {
                    alert("Error: The password is empty, too long, or has invalid characters.");
                }
                else {
                    alert("User created.");                     
                }
                console.log(errCode);
                $scope.errCode=errCode //you can either use this line or below line
                return errCode;
            }).
            error(function(data, status, headers, config) {
            // called asynchronously if an error occurs
            // or server returns response with an error status.
                alert("Error.");
            });
            console.log(self.username);

    }

在你的情况下,你在成功执行块之前返回错误代码(因为回调函数在数据从数据库获取时执行,所以需要一些时间。但是你的函数在成功执行块之前未定义函数retun errCode)