【问题标题】:Returning promise inside function giving typescript type error在给出打字稿类型错误的函数内返回承诺
【发布时间】:2020-08-27 03:17:51
【问题描述】:

我有一个场景,其中有一个功能可以检查是否需要 userWhiteListing。如果没有,则调用 allowUserToLogin 函数。如果是,则检查特定用户是否被列入白名单。如果未列入白名单则抛出错误,否则调用 allowUserToLogin 函数。

我正在寻找一种更好的 promise 方法,而不是 async await。

这是一个相同的示例。

public function sample():Promise<{ session: string , url: string }> {
 return this.userWhiteListingRqd().then((whiteListingRqd) => {    
  if(whiteListingRqd) {
    return this.isUserWhiteListed().then((userWhiteListed) => {
      if(!userWhiteListed) {
        throw new Error("error");
      }
      // Here if user whitelisted then it will go to allowUserToLogin 
      // But here typescript throws error Promise<void> cannot be assignable
      // to Promise<session: string , url:string>
    });
  }  
 });
  return this.allowUserToLogin().then(() => {
     return { session, url }; 
  });
}

private function userWhiteListingRqd(): Promise<boolean> {
  // returns boolean value
}

private isUserWhiteListed(): Promise<boolean> {
  // returns boolean value
}

我仍处于学习阶段。有没有更好的方法来使用 Promise 处理这种情况。

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript node.js typescript promise


    【解决方案1】:

    在许多情况下使用 async-await 可以清理承诺繁重的代码。

    public async function sample(): Promise<{ session: string; url: string }> {
      if (await this.userWhiteListingRqd() && !(await this.isUserWhiteListed()) {
        throw new Error("The user must be whitelisted but is not.");
      }
      await this.allowUserToLogin();
      return { session, url };
    }
    

    【讨论】:

    • 需要一个承诺的解决方案,因为我需要使我的代码与承诺保持一致......你有什么办法可以帮助我处理承诺。
    • @Vishnu 这确实使用了承诺。它只是没有明确使用 .then() 和 .catch() ,因为它使用 async/await 代替。
    • 是的,正确。但是在代码中有很多函数使用 promise 然后 catch。所以为了正确维护代码,我必须先使用promise然后catch..你能建议吗?
    • 仅仅因为其余的代码使用 .then() 和 .catch() 并不意味着它必须全部使用,你可以混合使用 async/await 和普通的 promise 方法,它不会受到伤害可读性。也就是说,我会尝试为您提供非异步/等待解决方案
    【解决方案2】:

    如果你不想使用 async/await,试试这个:

    function sample(): Promise<{ session: string; url: string }> {
      return this.userWhiteListingRqd()
        .then((whiteListingRqd) =>
          this.isUserWhitelisted().then(
            (isUserWhitelisted) => isUserWhitelisted || !whiteListingRqd
          )
        )
        .then((userIsAllowed) =>
          userIsAllowed ? this.allowUserToLogin() : Promise.reject(new Error())
        )
        .then(() => ({ session, url }));
    }
    
    

    警告:像这样的承诺链并不以可读性强而著称。

    【讨论】:

    • 在这个函数里,我怀疑this.isUserWhitelisted函数会等待promise解决吗?
    • 它应该等待 this.isUserWhitelisted 解决。
    • 对不起,我想我错过了一些东西。你能解释一下吗?如果 this.isUserWhitelisted 没有返回,我没有明白这一点,那么它将如何等待承诺解决?
    • 我假设你已经有一个函数 this.isUserWhitelisted 返回一个布尔值的承诺。然后代码等待布尔值,生成一个名为 userIsAllowed 的新布尔值,然后在下一个 .then 语句中从那里获取。
    猜你喜欢
    • 2021-06-17
    • 2017-03-18
    • 2019-04-25
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2018-12-28
    • 2022-01-12
    相关资源
    最近更新 更多