我想使用AngularJS实现登录功能,我的后端在Rails中。我决定使用$ httpBackend实现它,但我遇到了问题。
当它进入$ httpBackend函数时,它会使用数据库中的最新令牌更新令牌,但是我需要将值返回到我的服务,而这似乎不会发生。我知道这与承诺和推迟等有关,但我不熟悉那些。
这是我的代码
var authorized = false;
var token;
$httpBackend.whenPOST('https://login').respond(function(method, url, data) {
var loginDetails = data;
var d= $q.defer();
function startToken(loginDetails) {
getTokens.newToken(loginDetails).then(function(result) {
if(result.length > 0) {
var updateDB = "UPDATE preferences SET value='"+result[0].token+"' WHERE description='token'";
$cordovaSQLite.execute(db, updateDB).then(function(res) {
var updateDB1 = "UPDATE preferences SET value='true' WHERE description='logged_in'";
$cordovaSQLite.execute(db, updateDB1).then(function(res) {
var query = "SELECT description, value FROM preferences";
$cordovaSQLite.execute(db, query).then(function(res) {
if(res.rows.length > 0) {
if(res.rows.item(3).value!=null || res.rows.item(3).value!='') {
getTokens.getCRMToken(res.rows.item(2).value).then(function(resulttoken){
if(resulttoken[0].token == res.rows.item(3).value) {
token = res.rows.item(3).value;
}
d.resolve(token)
});
}
} else {
console.log("No results found");
}
}, function (err) {
console.error(err);
});
}, function (err) {
console.error(err);
});
}, function (err) {
console.error(err);
});
}
else {
console.log("reject")
d.reject(result);
}
}, 1000);
return d.promise;
}
var a = startToken(loginDetails).then(function(token) {
// in here the value for token is correct i then go ahead to set the value for authorized and resolve it
console.log(token)
if(token.length > 0){
console.log("authorized true")
authorized = true;
d.resolve(token, authorized)
}
else
{
console.log("authorized false")
authorized = false;
d.reject(token, authorized)
}
return d.promise;
})
// this is where i have my issue. all i want to do is to just check if the value for authorized is true, if yes, return the value for token.
//authorized = true;
//return [200 , { authorizationToken: token }];
});
答案 0 :(得分:2)
可悲的是,我认为简短的回答是你不能在$ httpBackend中使用promises。请参阅此讨论:https://github.com/angular/angular.js/issues/11245
在我原来的回答中,我没有意识到您使用的是$ httpBackend模拟,因为我只是专注于您不正确的承诺代码。有关承诺的信息(https://docs.angularjs.org/api/ng/service/$q)仍然有效。
ngMock的单元测试版本不处理承诺。如果您使用的$ httpBackend版本可以处理承诺,则需要返回承诺,而不是[200,“status”]。
然而,这就是说,在你的重写中,你也可以在解决后重复使用相同的promise,这是不正确的。您只能解决或拒绝延期一次。因此,您需要链接newToken()
函数或创建新的延迟。此外,您实际上并不需要创建延迟,因为{{1}}函数实际上会返回一个promise。