async/await
Javascript
Promiseを使った時のthen句をもっと書きやすくする
code:js
function syncWait(ms){
return new Promise(resolv=>{ setTimeout(resolv, ms); });
};
(async _=>{
// do something
await syncWait(1000);
// do something
await Promise.all(syncWait(100), syncWait(200)); // 両方の完了を待つ
// do something
})();
asyncは
code:js
async function(){
// hoge
}
↓
function(){
return new Promise(resolve=>{
//hoge
resolve();
});
}
の書き換え
awaitは
code:js
await fetch('http://hoge/');
console.log('fuga');
↓
fetch('http://hoge/')
.then(_=>{
console.log('fuga');
});
の書き換え
コールバック機構をasync/await化するなどして、Promiseと併用する場合、以下のような振る舞いになる。resolveせずにreturnすると、無言で後続処理を止めるのでなかなか渋い
code:javascript
async function(){
try{
const result = await new Promise((resolve, reject) => {
if(isSuccess) resolve('success')
else if(isFaild) reject('reject')
else if(isError) throw new Error('error')
else return
})
// resolveが実行された時だけ通過
} cache(e) {
// rejectが実行された時、またはthrowされた時に通過。その意味においては、rejectとthrowは等価と言える
}
}
Unity
コルーチンを別スレッドで動くようにするもの
Unity2017で始めるTask(async~await) - Qiita
大量処理中でもUnityのメインスレッドを止めない(フリーズさせない)のがメリット
code:cs
private void Start(){
btn.onClick.AddListener(()=>Func3());
}
// awaitを内包しているメソッドは、async Task をメソッドに付ける必要がある。
// 戻り値を使うときは async Task<Int> みたいな感じ
private async Task Func3(){
LogOutput("---Start---");
for (var i = 0; i < 10; ++i) {
// TaskへのSendに、awaitを付ける事で、Taskの完了を待つ
await Task.Delay(1000); // Task.Delay(int), Task.Run(function) で実行した内容が、別スレッドで動作する。
LogOutput($"Count:{i}");
}
LogOutput("---End---");
}
ただし、Unityの本流としては、同じ用途には JobSystem か、UniTaskの方が良いそうな
UniTaskの方が性能が良いらしい