首页 > 解决方案 > JavaScript 承诺设置

问题描述

我是一位经验丰富的工程师,但 JavaScript 中的 Promises 仍然让我非常困惑。最重要的是,我正在进行的项目使用 Flow 来输入 JavaScript。

因此,我有一个函数 A,它返回从网络请求返回的 URL 列表。这个函数实际上返回了一个 Promise 并且它是异步的。(返回类型为Promise<Array<URL>>

现在,我需要添加另一个同样返回 URL 列表的请求。和以前一样,我们称它为函数 B。(相同的返回类型Promise<Array<URL>>)。

然后原始函数的调用者期望返回一个承诺。所以,我正在考虑创建一个函数 C,它首先调用函数 B,然后根据函数 B 的结果,它要么返回该承诺,要么调用函数 A 并返回它的承诺。

我必须让它保持异步,而对于我的生活,我无法弄清楚这一点。如何编写函数 C?

请停下来!我希望这是有道理的。

PS有点像这样:

async getAllURLs(): Promise<?Array<SignedURL>> 
{

  let result: Promise<?Array<SignedURL>> = Promise.resolve([]); // wrong

  let res1 = this.getBetterUrls().then((urls) => 
  {
    if (urls && urls.length > 0) 
    {
      result = res1;
    } 
    else 
    {
      let res2 = this.getOldUrls().then((lesserUrls) => 
      {
        if (lesserUrls && lesserUrls.length > 0) 
        {
          result = res2;
        }
      });
    }
  });

  return result; // wrong
}

标签: javascriptasynchronouspromise

解决方案


我想这可以解决问题:

async getAllURLs(): Promise<Array<SignedURL>> {
  const betterUrls = await this.getBetterUrls();

  if (betterUrls && betterUrls.length > 0) { return betterUrls; }

  const lesserUrls = await this.getOldUrls();

  return lesserUrls && lesserUrls.length > 0 ? lesserUrls : [];
}

推荐阅读