【问题标题】:How to: await / async in a node.js lambda function?如何:在 node.js lambda 函数中等待/异步?
【发布时间】:2019-10-31 07:55:24
【问题描述】:

我正在尝试创建一个异步 lambda 函数,它使 http Get 调用无法正常工作,我相信它与异步有关。如果我删除 await/async 并使其同步,我的功能将正常工作。我不确定我做错了什么。感谢您的帮助!

exports.handler = async function (event, context) {

    await setBattery();

    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

async function setBattery() {
    'use strict';

    const https = require('https');

    const options = {
        hostname: 'testsite.com',
        port: 443,
        path: '/proxy/api/setting?EM_OperatingMode=1',
        method: 'GET',
        headers: {
            'Content-Type': 'application/json',
        }
    };

    const req = https.request(options, res => {
        console.log(`statusCode: ${res.statusCode}`);

        res.on('data', d => {
            process.stdout.write(d);
        });
    });

    req.on('error', error => {
        console.error(error);
    });

    req.end();

}

【问题讨论】:

  • 你还没有将 setBattery 的逻辑包装在一个承诺中。
  • 好的。我以前没有使用过承诺。
  • async/await 是使用 Promise 的工具,要理解 async/await 你需要理解 Promise。此外,将 async 添加到函数定义会将该函数的返回类型更改为 Promise,因此您需要处理该 Promise。类似exports.handler(a, b).then(() => {}).catch(() => {}).finally(() => {})
  • "如果我删除 await/async 并使其同步,我的功能可以正常工作。"为什么你希望它是异步的?
  • 我正在尝试向我们的 Alexa 智能家居技能 lambda 函数和大部分代码异步添加 http get 调用。

标签: javascript node.js async-await aws-lambda async.js


【解决方案1】:

根据 MDN Web Docs:

异步函数声明定义了一个异步函数,它 返回一个 AsyncFunction 对象。异步函数是 通过事件循环异步操作的函数,使用 隐式 Promise 返回其结果。但是语法和结构 您使用异步函数的代码更像是使用标准 同步函数。

所以,您需要返回一个Promise 对象以便由您的async function 处理(您也可以使用另一个promise 来处理它),我将setBattery 转换为一个普通函数并返回这个函数现在是一个承诺,将由您的处理程序 (exports.handler) 处理。我还没有测试过代码,但它应该可以工作。

exports.handler = async function (event, context) {

    await setBattery();

    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

function setBattery() {
    'use strict';

    const https = require('https');

    const options = {
        hostname: 'testsite.com',
        port: 443,
        path: '/proxy/api/setting?EM_OperatingMode=1',
        method: 'GET',
        headers: {
            'Content-Type': 'application/json',
        }
    };

    // Return it as a Promise
    return new Promise((resolve, reject) => {

        const req = https.request(options, res => {
            console.log(`statusCode: ${res.statusCode}`);

            res.on('data', d => {
                process.stdout.write(d);

                // If successful
                resolve(d);
            });
        });

        req.on('error', error => {
            console.error(error);

            // If failed
            reject(error);
        });

        req.end();

    });

}

【讨论】:

    猜你喜欢
    • 2020-08-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2018-09-29
    相关资源
    最近更新 更多