我想要实现使用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 }];
});
看来你需要学习如何承诺的工作。你基本上说:“声明var标记,稍后做些事情(),返回标记(声明但未定义)”。在不知道你回到什么的时候,很难告诉你应该如何使用诺言。您可以将该标记作为稍后由承诺填充的对象返回,也可以仅返回承诺对象。无论哪种方式,您都需要编写更多代码来处理非阻塞函数调用。 –
谢谢@doogabides你能指出我正确的方向吗? –