1
1
# async await
2
2
3
- > [ 同内容をカバーするPRO eggheadのビデオコース] ( https://egghead.io/courses/async-await-using-typescript )
4
-
5
- 思考実験として、次のことを想像してみてください: ` await ` キーワードがPromiseに対して使われた場合、JavaScriptコードの実行を一時停止する。そして、その関数から返されたPromiseが完了した場合にだけ、コードの実行が再開される。そのように、JavaScriptランタイムに指示する方法を想像してみてください:
3
+ 思考実験として、次のことを想像してみてください: ` await ` のキーワードがPromiseに対して使われた場合、JavaScriptコードの実行を一時停止します。そして、その関数から返されたPromiseが完了した場合にだけ、コードの実行が再開されます。このようにJavaScriptランタイムを制御する方法を想像してみてください:
6
4
7
5
``` typescript
8
- // Not actual code. A thought experiment
6
+ // 実際のコードではありません。ただの思考実験です。
9
7
async function foo() {
10
8
try {
11
9
var val = await getMeAPromise ();
@@ -28,11 +26,11 @@ Promiseが完了したとき、次の処理を続けます
28
26
* 関数の内側に値を入れられること
29
27
* 関数の内側に例外を投げられること
30
28
31
- これはまさにジェネレータが可能にしたことです! 上記の思考実験は、TypeScript / JavaScript の` async ` /` await ` の実装に使われています。それらの内側の仕組みは、単にジェネレータを使っているのです。
29
+ これはまさにジェネレータが可能にしたことです! 上記の思考実験は、TypeScript / JavaScript の` async ` /` await ` の実装に使われています。それらの内側の仕組みは、単にジェネレータを使っているのです。
32
30
33
31
## 生成されたJavaScript
34
32
35
- これを理解する必要はありませんが、[ ジェネレータ] ( generators.md ) のことを知っていれば、かなり簡単です。関数` foo ` は次のように単純にラップされたもので実現できます :
33
+ これを理解する必要はありませんが、[ ジェネレータ] ( generators.md ) のことを知っていれば、かなり簡単です。関数` foo ` は次のように単純に囲んだもので実現できます :
36
34
37
35
``` typescript
38
36
const foo = wrapToReturnPromise (function * () {
@@ -46,15 +44,15 @@ const foo = wrapToReturnPromise(function* () {
46
44
});
47
45
```
48
46
49
- この` wrapToReturnPromise ` は単にジェネレータ関数を実行して` generator ` を取得します。そして、` generator.next() ` を使います。返り値が` promise ` なら、その` promise ` を` then ` +` catch ` し、結果に応じて ` generator.next(result) ` または ` generator.throw(error) ` を呼び出します。それだけです!
47
+ この` wrapToReturnPromise ` は単にジェネレータ関数を実行して` generator ` を取得します。そして、` generator.next() ` を使います。返り値が` promise ` なら、その` promise ` を` then ` +` catch ` し、結果に応じて ` generator.next(result) ` または ` generator.throw(error) ` を呼び出します。それだけです!
50
48
51
49
## TypeScriptにおける Async Await のサポート
52
50
53
- ** Async - Await** は[ TypeScript1.7以降] ( https://www.typescriptlang.org/docs/handbook/release-notes/typescript-1-7.html ) でサポートされています。非同期関数の先頭に_async_キーワードが付きます。 _ await_は、非同期関数の戻り値promiseが完了し、_ Promise_から値を取得するまで実行を中断します。 以前は、** ターゲットがES6 ** の場合のみサポートしており、** ES6ジェネレータ ** に直接トランスパイルしていました。
51
+ ** Async - Await** は[ TypeScript1.7以降] ( https://www.typescriptlang.org/docs/handbook/release-notes/typescript-1-7.html ) でサポートされています。非同期関数の先頭に_async_キーワードが付きます。 _ await_は、非同期関数の戻り値promiseが完了し、_ Promise_から値を取得するまで実行を中断します。 以前は、** ターゲットがES6以降 ** の場合のみサポートしており、** ES6のジェネレータ ** に直接トランスパイルしていました。
54
52
55
- ** TypeScript2.1** は、[ ES3とES5のランタイムにAsync/Await機能を追加] ( https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html ) しました。これは、あなたがブラウザの環境に関係なく、それを利用できるということを意味しています 。TypeScript 2.1以降、Promiseのためのポリフィルがグローバルに追加されたことにより、多くのブラウザでasync/awaitがサポートされています。
53
+ ** TypeScript2.1** は、[ ES3とES5のランタイムにAsync/Await機能を追加] ( https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html ) しました。これが意味することは、ブラウザの環境に関わらず、Async/Awaitを利用できるということです 。TypeScript 2.1以降、Promiseのためのポリフィルがグローバルに追加されたことにより、多くのブラウザでasync/awaitがサポートされています。
56
54
57
- この例のコードを見て 、TypeScriptのasync/await記法がどのように機能するかを理解してください 。
55
+ このコードの例を見て 、TypeScriptのasync/awaitがどのように動作するかを理解してください 。
58
56
59
57
``` typescript
60
58
function delay(milliseconds : number , count : number ): Promise <number > {
@@ -65,12 +63,12 @@ function delay(milliseconds: number, count: number): Promise<number> {
65
63
});
66
64
}
67
65
68
- // async function always returns a Promise
66
+ // async関数は常にPromiseを返します
69
67
async function dramaticWelcome(): Promise <void > {
70
68
console .log (" Hello" );
71
69
72
70
for (let i = 0 ; i < 5 ; i ++ ) {
73
- // await is converting Promise<number> into number
71
+ // awaitは、 Promise<number>をnumberに変換します
74
72
const count: number = await delay (500 , i );
75
73
console .log (count );
76
74
}
@@ -81,7 +79,7 @@ async function dramaticWelcome(): Promise<void> {
81
79
dramaticWelcome ();
82
80
```
83
81
84
- ** ES6へのトランスパイル結果 \( --target es6\) **
82
+ ** ES6へのコンパイル結果 \( --target es6\) **
85
83
86
84
``` javascript
87
85
var __awaiter = (this && this .__awaiter ) || function (thisArg , _arguments , P , generator ) {
@@ -99,12 +97,12 @@ function delay(milliseconds, count) {
99
97
}, milliseconds);
100
98
});
101
99
}
102
- // async function always returns a Promise
100
+ // async関数は常にPromiseを返します
103
101
function dramaticWelcome () {
104
102
return __awaiter (this , void 0 , void 0 , function * () {
105
103
console .log (" Hello" );
106
104
for (let i = 0 ; i < 5 ; i++ ) {
107
- // await is converting Promise<number> into number
105
+ // awaitは、 Promise<number>をnumberに変換します
108
106
const count = yield delay (500 , i);
109
107
console .log (count);
110
108
}
@@ -116,7 +114,7 @@ dramaticWelcome();
116
114
117
115
完全な例を [ ここ] ( https://cdn.rawgit.com/basarat/typescript-book/705e4496/code/async-await/es6/asyncAwaitES6.js ) で見ることができます。
118
116
119
- ** ES5へのトランスパイル結果 \( --target es5\) **
117
+ ** ES5へのコンパイル結果 \( --target es5\) **
120
118
121
119
``` javascript
122
120
var __awaiter = (this && this .__awaiter ) || function (thisArg , _arguments , P , generator ) {
@@ -193,5 +191,5 @@ dramaticWelcome();
193
191
194
192
完全な例を [ ここ] ( https://cdn.rawgit.com/basarat/typescript-book/705e4496/code/async-await/es5/asyncAwaitES5.js ) で見ることができます。
195
193
196
- ** 注意** :ES6、ES5のどちらをターゲットにする場合でも、ランタイムがグローバルにECMAScriptに準拠したPromiseの機能を持っていることを確認する必要があります。Promiseのためにポリフィルを用意する必要があるかもしれません。また、libフラグを "dom", "es2015"もしくは"dom", "es2015.promise", "es5"のように設定することで、TypeScriptがPromiseの存在を認識できるようにする必要があります。 ** 各ブラウザのPromiseサポート\( ネイティブ実装およびポリフィル\) の有無を** [ ** ここ ** ] ( https://kangax.github.io/compat-table/es6/#test-Promise ) ** で確認できます。**
194
+ ** 注意** :ES6、ES5のどちらをターゲットにする場合でも、ランタイムがグローバルにECMAScriptに準拠したPromiseの機能を持っていることを確認する必要があります。Promiseのためにポリフィルを用意する必要があるかもしれません。また、libフラグを "dom", "es2015"もしくは"dom", "es2015.promise", "es5"のように設定することで、TypeScriptがPromiseの存在を認識できるようにする必要があります。 ** 各ブラウザのPromiseサポート\( ネイティブ実装およびポリフィル\) の有無を** [ ** このサイト ** ] ( https://kangax.github.io/compat-table/es6/#test-Promise ) ** で確認できます。**
197
195
0 commit comments