【问题标题】:How to use chain calls Promise?如何使用链调用 Promise?
【发布时间】:2018-02-06 04:19:37
【问题描述】:

现在在.then 部分,我又承诺了一个 http 请求:

.then(result => { this.service().then(data => {}); });

这是使用链式承诺的正确方法吗?

【问题讨论】:

  • 这取决于您的任务:如果您在第 2 个请求中使用 {{result}} 来自第一个请求(例如某些参数),那么是的,这是正确的方法。但是如果你需要并行进行 2 个调用,你可以结合 2 个 Promise
  • 没有。这就是所谓的回调地狱,正是承诺应该与之抗争的东西。

标签: angular typescript promise angular-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();
    // ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多