JavaScriptの言語設計モデルは非同期で処理することを前提にしています。(Node.jsの一部の関数を除けば)外部へ問い合わせしてその返答への待ちが発生するような関数は非同期で行われるため、コールバックで処理することが基本であり、他の言語のような返答があるまで待ってから処理するといった同期的な処理ができません。
非同期処理はシングルスレッドにおいて速度面で有利になるという利点があるのですが、そのままではコールバックを多用するため、いわゆるコールバック地獄という深いコールバックだらけで訳がわからないコードになってしまうと言う問題がありました。そこで、ES2015から追加されたのがPromiseです。しかし、Promiseでも使いやすいとは言えなかったため、より同期処理のように書けるようにしたのが、ES2017から追加されたasync関数です。
ということで、任意の非同期なコールバック関数は、Promise化し、async関数内でawait
を付けることで、同期処理のように書くことが可能になります。
JavaScript
1const request = require('request');
2
3const requestPromise = (options) => new Promise((resolve, reject) => {
4 request(options, (error,response,body) => {
5 if (error == null) {
6 resolve(body);
7 } else {
8 reject(error);
9 }
10 });
11});
12
13(async function() {
14 const options = 'https://teratail.com/'
15 body = await requestPromise(options);
16 console.log(body);
17})()
上記ではasync関数を即時関数にしていますが、任意のタイミングで実行する事は可能です。ただし、async関数自体は非同期に実行されると言うことに注意してください。
また、requestの場合は、初めから三種類のPromise化済みパッケージが用意されています。自分でPromise化せずにパッケージを使っても構いません。その中の一つであるrequest-promise-nativeを使った場合は次のようになります。(他のはPromiseの実装方法の違いですので、やり方は同じです)
const requestPromise = require('request-promise-native');
(async function() {
const options = 'https://teratail.com/'
body = await requestPromise(options);
console.log(body);
})()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。