teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

文言の修正

2018/04/02 12:36

投稿

raccy
raccy

スコア21780

answer CHANGED
@@ -24,7 +24,7 @@
24
24
  })()
25
25
  ```
26
26
 
27
- 上記ではasync関数を即時関数にしていますが、任意のタイミングで実行する事はかのうです。ただし、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化されたパッケージもあるよと言う話

2018/04/02 12:36

投稿

raccy
raccy

スコア21780

answer CHANGED
@@ -1,25 +1,39 @@
1
- JavaScriptの言語設計モデルは非同期で処理することを前提にしています。(Node.jsの一部の関数を除けば)外部へ問い合わせしてその返答への待ちが発生するような関数は非同期で行われるため、コールバックで処理することが基本であり、他の言語のような**返答があるまで待ってから処理する**といった同期での処理ができません。
1
+ JavaScriptの言語設計モデルは非同期で処理することを前提にしています。(Node.jsの一部の関数を除けば)外部へ問い合わせしてその返答への待ちが発生するような関数は非同期で行われるため、コールバックで処理することが基本であり、他の言語のような**返答があるまで待ってから処理する**といった同期的な処理ができません。
2
2
 
3
- 非同期処理はシングルスレッドでも速度面で有利になるという利点があるのですが、コールバックを多用するため、いわゆるコールバック地獄というコールバックだらけで訳がわからないコードになってしまうと言う問題がありました。そこで、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)です。
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化することで、async関数内で同期処理のように書くことが可能になります。
5
+ ということで、任意の非同期なコールバック関数は、Promise化、async関数内で`await`を付けることで、同期処理のように書くことが可能になります。
6
6
 
7
7
  ```JavaScript
8
8
  const request = require('request');
9
+
9
- const requestGetPromise = (options) => new Promise((resolve, reject) => {
10
+ const requestPromise = (options) => new Promise((resolve, reject) => {
10
- request.get(options, (error,response,body) => {
11
+ request(options, (error,response,body) => {
11
- // エラー処理とかも本当は必要
12
+ if (error == null) {
12
- resolve(body);
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 requestGetPromise(options);
22
+ body = await requestPromise(options);
19
23
  console.log(body);
20
24
  })()
21
25
  ```
22
26
 
23
- ※ 今ちょっと間が無いので未テストです。間違いあっらごめんなさい。
27
+ 上記ではasync関数を即関数にしてますが、任意タイミング実行する事はかのうです。ただし、async関数自体は非同期に実行れると言うことに注意してください。
24
28
 
25
- なおasync関数自体非同期に実行されると言うこと注意しください。
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
+ ```