LoginSignup
20
23

More than 5 years have passed since last update.

5分でasync/awaitを使ったナウい書き方を覚える

Last updated at Posted at 2017-10-31

概要

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 を付けて宣言できる
  • 関数が resolvereject するまで待つ
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});
                }
            }
        });
    });
}

再帰処理書くのくっそ楽

参考

20
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
23