async/await
Javascript
code:js
function syncWait(ms){
return new Promise(resolv=>{ setTimeout(resolv, ms); });
};
(async _=>{
// do something
await syncWait(1000);
// do something
// do something
})();
asyncは
code:js
async function(){
// hoge
}
↓
function(){
return new Promise(resolve=>{
//hoge
resolve();
});
}
の書き換え
awaitは
code:js
console.log('fuga');
↓
.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
大量処理中でも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---");
}
UniTaskの方が性能が良いらしい