回答編集履歴
2
文言の修正
answer
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
})()
|
25
25
|
```
|
26
26
|
|
27
|
-
上記ではasync関数を即時関数にしていますが、任意のタイミングで実行する事は
|
27
|
+
上記ではasync関数を即時関数にしていますが、任意のタイミングで実行する事は可能です。ただし、async関数自体は非同期に実行されると言うことに注意してください。
|
28
28
|
|
29
29
|
また、requestの場合は、初めから[三種類のPromise化済みパッケージ](https://github.com/request/request#promises--asyncawait)が用意されています。自分でPromise化せずにパッケージを使っても構いません。その中の一つであるrequest-promise-nativeを使った場合は次のようになります。(他のはPromiseの実装方法の違いですので、やり方は同じです)
|
30
30
|
|
1
コードの修正とはじめからPromise化されたパッケージもあるよと言う話
answer
CHANGED
@@ -1,25 +1,39 @@
|
|
1
|
-
JavaScriptの言語設計モデルは非同期で処理することを前提にしています。(Node.jsの一部の関数を除けば)外部へ問い合わせしてその返答への待ちが発生するような関数は
|
1
|
+
JavaScriptの言語設計モデルは非同期で処理することを前提にしています。(Node.jsの一部の関数を除けば)外部へ問い合わせしてその返答への待ちが発生するような関数は非同期で行われるため、コールバックで処理することが基本であり、他の言語のような**返答があるまで待ってから処理する**といった同期的な処理ができません。
|
2
2
|
|
3
|
-
非同期処理はシングルスレッド
|
3
|
+
非同期処理はシングルスレッドにおいて速度面で有利になるという利点があるのですが、そのままではコールバックを多用するため、いわゆる[コールバック地獄](http://callbackhell.com/)という深いコールバックだらけで訳がわからないコードになってしまうと言う問題がありました。そこで、ES2015から追加されたのが[Promise](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Using_promises)です。しかし、Promiseでも使いやすいとは言えなかったため、より同期処理のように書けるようにしたのが、ES2017から追加された[async関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/async_function)です。
|
4
4
|
|
5
|
-
ということで、任意の非同期なコールバック関数は、Promise化
|
5
|
+
ということで、任意の非同期なコールバック関数は、Promise化し、async関数内で`await`を付けることで、同期処理のように書くことが可能になります。
|
6
6
|
|
7
7
|
```JavaScript
|
8
8
|
const request = require('request');
|
9
|
+
|
9
|
-
const
|
10
|
+
const requestPromise = (options) => new Promise((resolve, reject) => {
|
10
|
-
request
|
11
|
+
request(options, (error,response,body) => {
|
11
|
-
|
12
|
+
if (error == null) {
|
12
|
-
|
13
|
+
resolve(body);
|
14
|
+
} else {
|
15
|
+
reject(error);
|
16
|
+
}
|
13
|
-
}
|
17
|
+
});
|
14
18
|
});
|
15
19
|
|
16
20
|
(async function() {
|
17
|
-
const options =
|
21
|
+
const options = 'https://teratail.com/'
|
18
|
-
body = await
|
22
|
+
body = await requestPromise(options);
|
19
23
|
console.log(body);
|
20
24
|
})()
|
21
25
|
```
|
22
26
|
|
23
|
-
|
27
|
+
上記ではasync関数を即時関数にしていますが、任意のタイミングで実行する事はかのうです。ただし、async関数自体は非同期に実行されると言うことに注意してください。
|
24
28
|
|
25
|
-
|
29
|
+
また、requestの場合は、初めから[三種類のPromise化済みパッケージ](https://github.com/request/request#promises--asyncawait)が用意されています。自分でPromise化せずにパッケージを使っても構いません。その中の一つであるrequest-promise-nativeを使った場合は次のようになります。(他のはPromiseの実装方法の違いですので、やり方は同じです)
|
30
|
+
|
31
|
+
```
|
32
|
+
const requestPromise = require('request-promise-native');
|
33
|
+
|
34
|
+
(async function() {
|
35
|
+
const options = 'https://teratail.com/'
|
36
|
+
body = await requestPromise(options);
|
37
|
+
console.log(body);
|
38
|
+
})()
|
39
|
+
```
|