javascript - 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
}
解决方案
我想这可以解决问题:
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 : [];
}
推荐阅读
- node.js - express 能否同时处理两个或多个请求?
- javascript - 如何实现确定性/基于刻度的游戏循环?
- tensorflow - 多值张量上的 TensorFlow 优化器
- javascript - 如何让 Sweetalert 返回真/假以确认没有承诺?
- mysql - 如何按用户每台设备选择最后一条消息
- memory - 无法移出作为参数传递的可选成员的借用内容
- static-site - Metalsmith Layouts - 没有要处理的文件
- r - 将 r 包导入 jupyter 笔记本(使用 rpy2)的最佳方法是什么?
- c++ - 如何使用SDL显示opengl应用程序的光标?
- git - Git致命:当名称也包含文档时,带有两个点的模棱两可的参数未知修订版修订规范