いまさらですが、ECMAScript 2017でasync/awaitが追加されました。
これまでのコールバック,Promise
,async/await
と書き方の違いを書いていきます。
前提
node.js v7.6以上
node.js v7系で試す場合は、オプション「–harmony-async-await」が必要です。
以下コード内で使用している、Util.promisifyはnode.js v8系からのものとなります。
環境
項目 | バージョン |
---|---|
node.js | 9.11.1 |
DynamoDB usersテーブル
パーティションキー:id(string)
コードの流れ
getItemParams.json
を読み込む- DynamoDB.getItemを実行
- 結果を表示
getItemParams.json
の内容
1 2 3 4 5 6 7 |
{ "TableName": "users", "Key": { "id": { "S": "u0001" } } } |
[コールバック]AWS DynamoDB GetItem
これぐらいだとあまり苦労せずに読むことができますが、ファイル読み込みDynamoDBへのリクエストとネストが深くなり解りづらいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
'use strict' const fs = require('fs'); const AWS = require('aws-sdk'); AWS.config.loadFromPath('./config/credentials.json'); AWS.config.update({ region: 'ap-northeast-1' }); const PARAMETER_FILE_PATH = './getItemParams.json'; const dynamodb = new AWS.DynamoDB(); fs.readFile(PARAMETER_FILE_PATH, 'utf8', (error, data) => { if (error) { console.log(error); return; } dynamodb.getItem(JSON.parse(data), (error, result) => { if (error) { console.log(error); return; } console.log(JSON.stringify(result)); }); }) |
[Promise]AWS DynamoDB GetItem
Promise
はthen/catch
のメソッドチェーンを使って処理を記述していきます。
ネストも浅いですし、「処理」「処理結果」を分けて記述し解りやすくなったのではないでしょうか。
使ってみると、then/catch
のメソッドチェーンを使用して複雑な処理を記述するのが面倒に感じると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
'use strict' const { promisify } = require('util'); const fs = require('fs'); const AWS = require('aws-sdk'); AWS.config.loadFromPath('./config/credentials.json'); AWS.config.update({ region: 'ap-northeast-1' }); const PARAMETER_FILE_PATH = './getItemParams.json'; const dynamodb = new AWS.DynamoDB(); promisify(fs.readFile)(PARAMETER_FILE_PATH, 'utf8') .then((data) => { return dynamodb.getItem(JSON.parse(data)) .promise() }) .then((data) => { console.log(JSON.stringify(data)); }) .catch((error) => { console.log(error); }); |
[async/await]AWS DynamoDB GetItem
async/await
はasync function
とawait
演算子からなります。
await
はasync function
内で利用でき、Promise
の処理が完了するのを待機します。
Promise
での実装ではメソッドチェーンを使って繋げていく複雑さがありましたが、async/await
では非同期処理を同期処理の様に記述することができ、楽に読むことができるのではないでしょうか。
【注意】
同期的に記載でき、Promise
を使用していないようですが、async function
の戻り値は、Promise
になります。
以下の処理の後に、別処理を行う様な場合は戻り値がPromise
であることを忘れないようにしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
'use strict' const { promisify } = require('util'); const fs = require('fs'); const AWS = require('aws-sdk'); AWS.config.loadFromPath('./config/credentials.json'); AWS.config.update({ region: 'ap-northeast-1' }); const PARAMETER_FILE_PATH = './getItemParams.json'; const dynamodb = new AWS.DynamoDB(); async function getItem() { try { const fileData = await promisify(fs.readFile)(PARAMETER_FILE_PATH, 'utf8'); const data = await dynamodb.getItem(JSON.parse(fileData)).promise(); console.log(JSON.stringify(data)); } catch (error) { console.log(error); } } getItem(); |