所以我的应用程序中有以下方法:
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都详细说明了这一点)。编辑:回答
答案 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)