【问题标题】:What the idiom for a chain of promises?一串承诺的成语是什么?
【发布时间】:2017-10-11 18:10:28
【问题描述】:

我如何一个接一个地执行两个承诺?

例如,在 JavaScript 中我可以

var promise1 = new Promise();
var promise2 = new Promise();

// await returns a result2 from promise2
await promise1.then(() => promise2);

如何在 Perl 6 中做同样的事情?

my $promise1 = Promise.new();
my $promise2 = Promise.new();

// Here I get only Promise2 object, not its result
await promise1.then({ $promise2 });

我必须像这样等待 $promise2 吗?

await promise1.then({ await $promise2 });

【问题讨论】:

  • 即使在 JavaScript 中也是错误的。你应该一直在使用await Promise.all([promise1, promise2])(如果你正在寻找它,然后从结果数组中获取第二个值),否则如果promise2promise1 解决之前被拒绝,你可能会得到未处理的拒绝。我敢肯定还有一个等同于 Promise.all 的 Perl
  • 你的第一个代码块不是一系列的承诺。两者都是并行执行的。
  • @Bergi,如果我需要在 promise2 中使用 promise1 的结果怎么办?假设 promise1 返回一些令牌,然后 promise2 使用它。通常我使用类似promise1.then(result1 => promise2) Promise.all 的东西并行执行,而不是按顺序执行
  • @YuriyZhilovets 没关系,但是您不会在 then 回调之外编写 var promise2 = new Promise(…); - 您将在回调中构造它(使用令牌)。
  • 它们是按顺序运行还是并行运行都没有关系。尝试await $promise1, $promise2;,如果不起作用,请提出新问题。

标签: promise raku


【解决方案1】:

如果您想一个接一个地执行两个异步操作,将第一个的结果输入第二个,那么只需执行两个awaits:

my $result = await something-that-returns-a-Promise(); await something-else-returning-a-Promise-using($result);

或者没有中间变量:

await something-else-returning-a-Promise-using(await something-that-returns-a-Promise());

根本不需要.then

【讨论】:

  • @jnthn 如果Foo.then: &code 在调用&code 时自动传递$_ 绑定到Foos 结果,这可能/有意义吗?
  • @raiph 它传递了Promise.then 作为参数被调用;如果&code 是一个简单的块,那么它将在$_ 中结束。例如,您可以使用$promise.then({ something-with(.result) })。我们传入Promise 而不是结果的原因是Promise 可能已损坏。调用.result 并且不处理任何异常将反过来破坏.then 返回的Promise,这意味着未处理的错误会沿着链传播。
  • @jnthn 完美。谢谢。 :)
  • @jnthn 如果我想将一个 Promise 的顺序链(一个 Promise,获取结果并将其提供给另一个 Promise)到一个返回它的单个 Promise 中怎么办?由于某些功能?像这样:await get-token-and-then-get-result($url)函数get-token-and-then-get-result本身不能做await,因为它在主程序的职责中
  • @YuriyZhilovets 你的意思是如果你有一些函数列表,每个函数都接受一个参数并返回一个Promise?然后我想减少是一种方法:my @ops = -> $x { start { $x + 1 } }, -> $y { start $y * 2 }, -> $z { start $z - 3 }; my $p = (start { 4 }, |@ops).reduce: -> $prom, &op { $prom.then({ await(op(.result)) }) }; say await $p 左右。
猜你喜欢
  • 2019-04-27
  • 2015-05-29
  • 2012-02-04
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 2017-10-09
相关资源
最近更新 更多