2017-10-11 80 views
1

我该如何执行两个承诺,一个接一个?承诺链条的成语是什么?

例如,在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 }); 
+3

这甚至在JavaScript中也是错误的。你应该一直在使用'await Promise.all([promise1,promise2])'(然后从结果数组中获得第二个值,如果你正在寻找的话),否则如果'promise2'拒绝,你可能会得到未处理的拒绝在'promise1'结算之前。我确定有一个与'Promise.all'等价的Perl – Bergi

+1

您的第一个代码块不是承诺的串行链。两者都在并行执行。 – jfriend00

+0

@Bergi,如果我需要在promise2中使用promise1的结果呢? 假设promise1返回一些令牌,然后promise2使用它。 通常我使用的东西沿线 'promise1.then(RESULT1 => promise2)' Promise.all执行所有并行,不sequentally –

回答

4

如果你想要做的两个异步操作一前一后,进给第一到第二的结果,那么它会只是做了两个await s的情况下:

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

+0

@jnthn在调用'&code'时,如果'Foo.then:&code'会自动传递绑定到'Foo'结果的'$ _',是否可以/有意义? – raiph

+0

@raiph它传递'.then'作为参数被调用的'Promise';如果'&code'是一个简单的块,那么它将以'$ _'结尾。因此,例如,您可以执行'$ promise.then({something-with(.result)})'。我们通过“承诺”而不是结果的原因是“承诺”可能已经被打破。调用'.result'并且不处理任何异常将反过来破坏'.then'返回的'Promise',这意味着未处理的错误会沿着链传播。 –

+0

@jnthn完美。谢谢。 :) – raiph