【问题标题】:How to return value in then()then()中如何返回值
【发布时间】:2019-04-11 00:07:32
【问题描述】:

我知道有人问过类似的问题。但我会解释其中的区别。

我有一个名为login() 的函数需要返回一个用户。该函数调用另一个函数,该函数调用我的后端。 login() 函数需要在返回用户之前等待承诺完成。问题是,如果我将返回值放在then() 中,它会说:

[ts] 声明类型既不是“void”也不是“any”的函数必须 返回一个值。

需要返回,因为调用它的函数需要用户的JWT。


简化代码:

login(user: User): User {
  this.user = user;
  //in between I fill some fields for the user
  this.loginPromise().then(user => {
    return user;
  })
  .catch(err => {
    console.log(err);
    //it doesn't make a difference wether I return a user here or not
}

loginPromise(): Promise<{}> {
 var promise = new Promise(function(resolve, reject) {
  this.restProvider.login(this.user)
  .subscribe(result => {
    const jwt = result.headers.get('JWT');
    const config = { ... result.body };
    if(config['result'] != 'failed'){
      this.user.$JsonWebToken = jwt;
      this.user.$passwordIsValid = true;
      this.user.$usernameIsValid = true;
      resolve(this.user);
    }
  }, err => {
    console.log("error: " + err);
    reject(err);
  });
 })
 return promise;
}

【问题讨论】:

    标签: angular rest typescript ionic-framework promise


    【解决方案1】:

    你不能从.then返回,你可以在这里使用一个选项是使用async await,但是在这种情况下你的login函数将返回promise,所以你需要调用.then登录时调用login函数

    async login(user: User): Promise<User> {
      this.user = user;
    
      return await this.loginPromise();
    }
    

    【讨论】:

      【解决方案2】:

      你的login函数不能直接返回User对象,它必须返回Promise&lt;User&gt;对象,因为它异步获取user对象。

      login(user: User): Promise<User> {
        this.user = user;
        //in between I fill some fields for the user
        return this.loginPromise()
        .catch(err => {
          console.log(err);
        });
      }
      

      然后消费者函数将调用login函数并使用.then获取从服务器检索到的user值。

      this.login().then(
        user => console.log(user);
      )
      

      【讨论】:

      • 这成功了!另外,在消费者处我添加了另一个.then(()=&gt; { //do stuff });,这样代码只会在前一个位完成后触发。
      【解决方案3】:

      如果你从 loginPromise(): Promise&lt;{}&gt; 更改为像 loginPromise(){ 这样简单的东西,我认为它仍然返回一个值

      【讨论】:

        猜你喜欢
        • 2019-07-12
        • 2019-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多