Обещание. тогда не работает внутри асинхронного лямбда-обработчика - PullRequest
0 голосов
/ 04 июля 2018

Я реализовал простой вызов БД здесь Это работает и вывод 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')
    }
}

Теперь, если я использую async для обработчика, он всегда дает вывод как null, хотя мой promiss.all.then console.log работает.

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

Мне нужен 2-й подход к работе. Я что-то здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Вы можете сделать это

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')
    }
}

Или, если вы хотите, чтобы операции db выполнялись параллельно, попробуйте это

var [p1, p2] = [
  await db.findOne('logs', { id: 1 }), 
  await db.findOne('logs', { id: 1 })
]
0 голосов
/ 04 июля 2018

При использовании async/await вы должны await свои обещания:

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')
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...