W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
通過Hack接口表示Awaitable。雖然有幾個類實現(xiàn)Awaitable,但是沒有必要關(guān)心他們的實現(xiàn)細節(jié)。Awaitable是您需要的唯一接口。
從一個異步函數(shù)返回的類型是Awaitable<T>,其中T是最后的結(jié)果類型(例如,int等候的值的)。
async function foo(): Awaitable<int> {...}
$x = foo(); // $x will be an Awaitable<int>
$x = await foo(); // $x will be an int
<?hh
namespace Hack\UserDocumentation\Async\Awaitables\Examples\AwaitableReturn;
async function f(): Awaitable<int> {
return 2;
}
// You call f() and get back an Awaitable<int>
// Once the function is finish executing and you await the awaitable (or in
// this case explicitly join since this call is not in an async function) to get
// the explicit result of the function call, you will get back 2.
var_dump(\HH\Asio\join(f()));
Output
int(2)
所有async功能必須返回Awaitable。async因此,調(diào)用函數(shù)將產(chǎn)生一個實現(xiàn)該Awaitable接口的對象,并且必須await或join從該對象獲取操作的最終結(jié)果。當您await暫停當前??任務(wù),直到與Awaitable句柄關(guān)聯(lián)的操作完成,其他任務(wù)可以自由繼續(xù)執(zhí)行。join是類似的,但它阻止所有其他操作完成,直到Awaitable返回。
在大多數(shù)情況下,你會喜歡await的Awaitable,這樣當你阻塞操作完成其他任務(wù)可以執(zhí)行。但是請注意,只有async功能可以控制其他異步,所以await可能只能在一個async功能中使用。對于其他位置,如main塊,您將需要使用join,本節(jié)后面將會介紹。
很多時候你會await一個人Awaitable,得到結(jié)果,繼續(xù)前進。
<?hh
namespace Hack\UserDocumentation\Async\Awaitables\Examples\SingleAwaitable;
async function foo(): Awaitable<int> {
return 3;
}
async function single_awaitable_main(): Awaitable<void> {
$aw = foo(); // awaitable of type Awaitable<int>
$result = await $aw; // an int after $aw completes
var_dump($result);
}
single_awaitable_main();
Output
int(3)
你通常會看到類似的東西await f();,結(jié)合了waiting的Awaitable和檢索Awaitable的結(jié)果。上面的例子將其分離出來用于說明目的。
其他的時候,你會收集一堆Awaitable和await他們的一切,然后繼續(xù)前進。
在這里,我們使用HH\Asio命名空間中的兩個內(nèi)置異步協(xié)助函數(shù)之一,以便將一堆Awaitable時間批量化在一起await:
<?hh
namespace Hack\UserDocumentation\Async\Awaitables\Examples\MultipleAwaitables;
async function quads(float $n): Awaitable<float> {
return $n * 4.0;
}
async function quads_m(): Awaitable<void> {
$awaitables = array(
'five' => quads(5.0),
'nine' => quads(9.0),
);
$results = await \HH\Asio\m($awaitables);
var_dump($results['five']); // float(20)
var_dump($results['nine']); // float(36)
}
quads_m();
Output
float(20)
float(36)
有時你希望得到一個結(jié)果出來的awaitable的,當你在函數(shù)不是 async。對于這一點HH\Asio\join(),需要一個Awaitable和塊才能解決一個結(jié)果。
這意味著不能等待來自全局范圍(也稱為偽域)的異步函數(shù)的調(diào)用,必須加入。
<?hh
namespace Hack\UserDocumentation\Async\Awaitables\Examples\Join;
async function get_raw(string $url): Awaitable<string> {
return await \HH\Asio\curl_exec($url);
}
function join_main(): void {
$result = \HH\Asio\join(get_raw("http://www.example.com"));
var_dump(substr($result, 0, 10));
}
join_main();
Output
string(10) "<!doctype "
你不應(yīng)該調(diào)用join()
一個async
函數(shù)。這將打破目前async
的awaitable,任何依賴將同步完成,阻止任何其他awaitable其軌跡運行。只是await
在一個async
功能。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: