如何使用链调用 Promise?
Posted
技术标签:
【中文标题】如何使用链调用 Promise?【英文标题】:How to use chain calls Promise? 【发布时间】:2018-02-06 04:19:37 【问题描述】:现在在.then
部分,我又承诺了一个 http 请求:
.then(result => this.service().then(data => ); );
这是使用链式承诺的正确方法吗?
【问题讨论】:
这取决于您的任务:如果您在第 2 个请求中使用 result 来自第一个请求(例如某些参数),那么是的,这是正确的方法。但是如果你需要并行进行 2 个调用,你可以结合 2 个 Promise 没有。这就是所谓的回调地狱,正是承诺应该与之抗争的东西。 【参考方案1】:几乎!您需要在函数中返回承诺,如下所示:
.then(result => return this.service().then(data => ); );
或者像这样:
.then(result => this.service().then(data => ));
【讨论】:
当你不使用新的承诺时,它的意义在哪里? @Daniel 因为 Promise 代表一个值。首先应该将其视为一个值(稍后可用),而不是一些花哨的回调系统。【参考方案2】:是的,您的两个承诺是按顺序解决的。但请记住,您的第二个(内部)promise 只有在第一个 then 成功解决时才会被调用。
更清洁的解决方案是:
.then(result => this.service()).then(data => );
正如 Hrishi 在 this SO answer 中阐述的那样,在 then()
函数中返回一个“thenable”(例如一个 Promise),使旧的 Promise 采用新 Promise 的状态。
【讨论】:
并非如此。这是一个名为 the broken chain 的反模式 @YuryTarabanko 你确定吗?我的理解是,当您在承诺中添加then()
,但之后返回原始承诺(没有附加then()
)时,会发生断链反模式。在我的示例中,任何错误都可以通过单个 catch()
捕获。
非常确定。在then
中吞下内部承诺对错误处理造成的问题与您返回原始承诺相同(甚至更糟)。您的示例是完全不同的代码。它不会破坏承诺链(前提是您要从data =>
@YuryTarabanko 啊,我以为你在谈论我的例子。 OPs 代码符合断链模式。在这一点上,我完全支持你。
:) 当我留下评论时,这里没有代码。所以是的,我的评论是关于 OP 的代码。【参考方案3】:
由于您使用的是 Typescript,您可以使用 async/await
以更易读的方式链接 Promise:
function firstCall(): Promise<any> /* return a promise */
function service(): Promise<any> /* return a promise */
async function runPromisses()
var result = await firstCall();
var data = await service();
// ...
【讨论】:
以上是关于如何使用链调用 Promise?的主要内容,如果未能解决你的问题,请参考以下文章