如何使用链调用 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?的主要内容,如果未能解决你的问题,请参考以下文章

从如何停掉 Promise 链说起

如何在数组方法链中展开 Promise 数组?

如何将额外数据传递到 Parse Promise 链 [重复]

复杂承诺返回链中的承诺 catch() 顺序

如何使用 Promise Kit 调用递归函数?

如何在没有“缩进金字塔”的情况下正确表达任意 Promise 链? [复制]