javascript(ES7)でもasync/awaitがあったので、await
した後、どの処理に移るのかを、C#と比較してみました。
動作環境
C#
- .NET Core 1.1
javascript
- Chrome 57
検証コード
C#
using System;
using System.Threading;
using System.Threading.Tasks;
namespace dotnet
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("before async");
TestAsync();
Console.WriteLine("after async");
Thread.Sleep(3000);
}
static async Task TestAsync() {
Console.WriteLine(" before heavy");
string result = await HeavyTask("2");
Console.WriteLine(" after heavy");
Console.WriteLine(" result: " + result);
Console.WriteLine(" after result");
}
static async Task<string> HeavyTask(string str) {
await Task.Delay(1000);
return str;
}
}
}
javascript
console.log(' before async');
testAsync();
console.log(' after async');
async function testAsync() {
console.log(' before heavy');
let result = await heavyTask('2');
console.log(' after heavy');
console.log(' result: ' + result);
console.log(' after result');
}
async function heavyTask(val) {
return new Promise(resolve => {
setTimeout(() => {
resolve(val);
}, 1000);
});
}
結果
C#
javascript
C# も javascript も同様に、await
のところで、そのメソッドから抜け出して、呼び出し元のメインの次の処理(after async
の出力)に進んでいることがわかりました。await
後の処理は、await
した処理が完了してから実行されます。
まとめ
C# と javascript で同じように動作するため、javascriptの async/await もC#と同様に考えればいいようです。