我尝试从一系列回调中获取结果。问题在于根本不会返回任何结果。
这是我要解决的代码:
主要功能:
let userldap:userLDAP = {controls:[],objectClass:[],dn:"",sn:"",givenName:"",mail:"",uid:"",cn:"",userPassword:""};
let res:ldapRes = {err:"",info:"",user:userldap};
this.ldap.authentication(credentials,res);
因此,基本上,我只是想在res对象中编辑值。
服务:
public authentication(
credentials: Credentials,
res:ldapRes,
):void {
this.ldap.authenticate(credentials.username, credentials.password,function(err:string,user:any,info:string) {
res.err = err;
res.info=info;
res.user=user;
});
}
这实际上是一个非常基本的用法。尽管如此,authenticate函数中的回调似乎无法编辑res对象。
我尝试了很多类似全局上下文之类的方法,但是authenticate函数中的回调似乎只是在做他的工作,而不是从整个宇宙中消失。即使更改了对象,它也只是重置为其旧值。
因此,如果有人对我搞砸了有一个线索(因为这是代码的基本知识,定义范围可变的问题,我知道,但是找不到解决方案),我会很高兴听到:)。
谢谢。
EDIT:如建议的那样,并且已经尝试过,在auth函数内部的回调上等待不能解决问题:
public async authentication(credentials : Credentials, res: ldapRes):Promise<ldapRes>{
//console.log(res);
await this.ldap.authenticate(credentials.username, credentials.password, function(err:string,user:any,info:string) {
res.err = err; res.info=info; res.user = user;
console.log("Callback from inside auth function :");
console.log(res);
});
console.log("Callback from outside auth function :");
console.log(res);
return res;
}
在这种情况下,内部的日志就像一个配饰,外部的日志仍显示res的重置版本(无值)。
答案 0 :(得分:0)
我们找到了解决方法。问题是我们对Typescript中的Promise principe有误解。事实是,您不仅可以在User对象中返回函数中的Promise。
主要功能:
async verifyCredentials(credentials: Credentials): Promise<User> {
let proms = new Promise<User>(function(resolve,reject){
ldap.authentication(credentials).then(val => {
let foundUser : User = new User();
foundUser.email = val.user.mail;
foundUser.firstName = val.user.givenName;
foundUser.lastName = val.user.sn;
foundUser.id = val.user.uid;
resolve(foundUser);
})
})
return proms;
}
LDAP功能:
public async authentication(
credentials: Credentials,
){
return new Promise<ldapRes>(function(resolve, reject){
ldap.authenticate(credentials.username, credentials.password,function(err:string,user:any,info:string) {
resolve({err,user,info});
});
});
}