回调不编辑值

时间:2019-06-12 09:54:26

标签: typescript

我尝试从一系列回调中获取结果。问题在于根本不会返回任何结果。

这是我要解决的代码:

主要功能:

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的重置版本(无值)。

1 个答案:

答案 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});
      });

    });

  }