2017-10-11 78 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