概要
nodejsのasync/awaitについてサンプル付きで簡単にまとめました。
'こまけぇこたぁとりあえず良いんだよ' の精神。
環境
version
v8.2.0
超 雑感
先ずは雑に、なんとなく。動かしてみる。
async
- 関数の前に
async
と付けて関数を定義できる。 -
async
と付けて定義すると中でawait
を使うことが出来る。
promiseで包む
function sample() {
return new Promise((resolve, reject) => {
// 超絶怒涛の処理
resolve();
});
}
async
async function asyncSample(){
// 空前絶後の処理
return;
}
await
-
async
を付けた関数の中で生きられる - promiseで包んだ関数に
await
を付けて宣言できる - 関数が
resolve
かreject
するまで待つ
await
async function asyncSample(){
let await promisedFnction();
return;
}
promisedFnction()の中で resolve/reject するまで待ちます。
sample
DynamoDBおじさんなのでAWS-SDKを使ったDynamoDBへのQueryをサンプルにします。
スクリプトの説明
1回のqueryでは全件出力できない時、DynamoDBは LastEvaluatedKey
という項目を返します。
次のリクエストの際に ExclusiveStartKey
に先程入手した LastEvaluatedKey
をセットすると前回の続きからデータを取得することが出来ます。
これをasync/awaitを使って記述します。
index.js
'use strict';
const aws = require('aws-sdk');
const dy = new aws.DynamoDB.DocumentClient({
region: 'ap-northeast-1'
});
const hashKeyId = '123456789012';
main(hashKeyId)
.then(v => {
console.log('[END] main function response data: ', v);
})
.catch(e => {
console.log('[END] main function response error data: ', e);
});
async function main(hashKeyId) {
let params = {
TableName: 'dynamodb_table_name',
KeyConditionExpression: "#hash = :val",
ExpressionAttributeNames: {
"#hash": "hash_key_name"
},
ExpressionAttributeValues: {
":val": hashKeyId
}
};
try {
let response = await doQuery(params);
let results = response.data;
while (response.LastEvaluatedKey) {
results.concat(response.data);
params.ExclusiveStartKey = response.LastEvaluatedKey;
response = await doQuery(params);
}
results.concat(response.data);
return results.length;
} catch (e) {
//console.log('[ERROR] catch error object: ', e);
throw new Error(e);
}
}
function doQuery(parameter) {
return new Promise((resolve, reject) => {
dy.query(parameter, (err, data) => {
if (err) {
//console.log('[ERROR] DynamoDB Query Error: ', err);
reject(err);
} else {
//console.log('[INFO] DynamoDB Query data: ', data);
if (data.LastEvaluatedKey) {
resolve({data: data.Items, LastEvaluatedKey: data.LastEvaluatedKey});
} else {
resolve({data: data.Items});
}
}
});
});
}