回答編集履歴

2

文言の修正

2018/04/02 12:36

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
 
52
52
 
53
- 上記ではasync関数を即時関数にしていますが、任意のタイミングで実行する事はかのうです。ただし、async関数自体は非同期に実行されると言うことに注意してください。
53
+ 上記ではasync関数を即時関数にしていますが、任意のタイミングで実行する事は可能です。ただし、async関数自体は非同期に実行されると言うことに注意してください。
54
54
 
55
55
 
56
56
 

1

コードの修正とはじめからPromise化されたパッケージもあるよと言う話

2018/04/02 12:36

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -1,12 +1,12 @@
1
- JavaScriptの言語設計モデルは非同期で処理することを前提にしています。(Node.jsの一部の関数を除けば)外部へ問い合わせしてその返答への待ちが発生するような関数は非同期で行われるため、コールバックで処理することが基本であり、他の言語のような**返答があるまで待ってから処理する**といった同期での処理ができません。
1
+ JavaScriptの言語設計モデルは非同期で処理することを前提にしています。(Node.jsの一部の関数を除けば)外部へ問い合わせしてその返答への待ちが発生するような関数は非同期で行われるため、コールバックで処理することが基本であり、他の言語のような**返答があるまで待ってから処理する**といった同期的な処理ができません。
2
2
 
3
3
 
4
4
 
5
- 非同期処理はシングルスレッドでも速度面で有利になるという利点があるのですが、コールバックを多用するため、いわゆるコールバック地獄というコールバックだらけで訳がわからないコードになってしまうと言う問題がありました。そこで、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)です。
5
+ 非同期処理はシングルスレッドにおいて速度面で有利になるという利点があるのですが、そのままではコールバックを多用するため、いわゆる[コールバック地獄](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)です。
6
6
 
7
7
 
8
8
 
9
- ということで、任意の非同期なコールバック関数は、Promise化することで、async関数内で同期処理のように書くことが可能になります。
9
+ ということで、任意の非同期なコールバック関数は、Promise化、async関数内で`await`を付けることで、同期処理のように書くことが可能になります。
10
10
 
11
11
 
12
12
 
@@ -14,15 +14,23 @@
14
14
 
15
15
  const request = require('request');
16
16
 
17
- const requestGetPromise = (options) => new Promise((resolve, reject) => {
18
17
 
19
- request.get(options, (error,response,body) => {
20
18
 
21
- // エラー処理とかも本当は必要
19
+ const requestPromise = (options) => new Promise((resolve, reject) => {
22
20
 
23
- resolve(body);
21
+ request(options, (error,response,body) => {
24
22
 
23
+ if (error == null) {
24
+
25
+ resolve(body);
26
+
27
+ } else {
28
+
29
+ reject(error);
30
+
31
+ }
32
+
25
- }});
33
+ });
26
34
 
27
35
  });
28
36
 
@@ -30,9 +38,9 @@
30
38
 
31
39
  (async function() {
32
40
 
33
- const options = .... // 適当な設定をする
41
+ const options = 'https://teratail.com/'
34
42
 
35
- body = await requestGetPromise(options);
43
+ body = await requestPromise(options);
36
44
 
37
45
  console.log(body);
38
46
 
@@ -42,8 +50,28 @@
42
50
 
43
51
 
44
52
 
45
- ※ 今ちょっと無いので未テストです。間違いあっらごめんなさい。
53
+ 上記ではasync関数を即関数にしています、任意タイミング実行する事はかのうです。ただし、async関数自体は非同期に実行れると言うことに注意してください。
46
54
 
47
55
 
48
56
 
49
- なお、async関数体は非同期実行されと言こと注意してくださ
57
+ またrequestの場合は、初めから[三種類のPromise化済みパッケージ](https://github.com/request/request#promises--asyncawait)が用意されています。分でPromise化せずパッケージを使っても構いません。その中の一つであrequest-promise-nativeを使った場合は次のようになります。(他のはPromiseの実装方法の違ですので、やり方は同じです)
58
+
59
+
60
+
61
+ ```
62
+
63
+ const requestPromise = require('request-promise-native');
64
+
65
+
66
+
67
+ (async function() {
68
+
69
+ const options = 'https://teratail.com/'
70
+
71
+ body = await requestPromise(options);
72
+
73
+ console.log(body);
74
+
75
+ })()
76
+
77
+ ```