Mayank Kumar
Mayank Kumar

Reputation: 176

promise.then not working inside async lambda handler

I have implemented a simple db call here This works and output is success

const Database = require('../utils/Database')

module.exports.logActivityLog =  (event, context, callback) => {
    try {
        context.callbackWaitsForEmptyEventLoop = false
        const db = new Database('config1')
        var p1 = db.findOne('logs', { id: 1 })
        var p2 = db.findOne('logs', { id: 1 })

        Promise.all([p1, p2]).then((values) => {
            console.log(db.getConnection().threadId)
            console.log('values', values)
            callback(null, 'success')
        }).catch((e) => {
            console.log(e)
            callback(null, 0)
        })
    } catch (error) {
        console.log(error)
        callback(null, 'error')
    }
}

Now, if I use async for handler it always gives output as null, although my promiss.all.then's console.log works.

module.exports.logActivityLog = async (event, context, callback) => {
    //exactly same as above
}

I need the 2nd approach to work. Am I doing something wrong here?

Upvotes: 1

Views: 1977

Answers (2)

Alfred Ignatius
Alfred Ignatius

Reputation: 53

You can do this

const Database = require('../utils/Database')

module.exports.logActivityLog = async (event, context, callback) => {
    try {
        context.callbackWaitsForEmptyEventLoop = false
        const db = new Database('config1')
        var p1 = await db.findOne('logs', { id: 1 })
        var p2 = await db.findOne('logs', { id: 1 })
        console.log(db.getConnection().threadId)
        console.log('values', p1, p2)
        callback(null, 'success')
    } catch (error) {
        console.log(error)
        callback(null, 'error')
    }
}

Or if you want the db operations to run in parallel try this

var [p1, p2] = [
  await db.findOne('logs', { id: 1 }), 
  await db.findOne('logs', { id: 1 })
]

Upvotes: 2

nijm
nijm

Reputation: 2218

When using async/await you should await your promises:

const Database = require('../utils/Database')

module.exports.logActivityLog = async (event, context, callback) => {
    try {
        context.callbackWaitsForEmptyEventLoop = false
        const db = new Database('config1')
        var p1 = db.findOne('logs', { id: 1 })
        var p2 = db.findOne('logs', { id: 1 })

        try {
            const values = await Promise.all([p1, p2])
            console.log(db.getConnection().threadId)
            console.log('values', values)
            callback(null, 'success')
        } catch (e) {
            console.log(e)
            callback(null, 0)
        }
    } catch (error) {
        console.log(error)
        callback(null, 'error')
    }
}

Upvotes: 0

Related Questions