Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何:在node.js lambda函数中等待/异步?_Javascript_Node.js_Async Await_Aws Lambda_Async.js - Fatal编程技术网

Javascript 如何:在node.js lambda函数中等待/异步?

Javascript 如何:在node.js lambda函数中等待/异步?,javascript,node.js,async-await,aws-lambda,async.js,Javascript,Node.js,Async Await,Aws Lambda,Async.js,我正在尝试创建一个异步lambda函数,使httpGet调用put无法正常工作,我相信这与异步有关。如果删除wait/async,并使其同步,我的函数将正常工作。我不确定我做错了什么。谢谢你的帮助 exports.handler = async function (event, context) { await setBattery(); // TODO implement const response = { statusCode: 200,

我正在尝试创建一个异步lambda函数,使httpGet调用put无法正常工作,我相信这与异步有关。如果删除wait/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();

}

根据MDN Web文档:

异步函数声明定义了一个异步函数,该函数 返回一个AsyncFunction对象。异步函数是一个 函数,该函数使用 返回结果的隐式承诺。但是 使用异步函数的代码更像是使用标准函数 同步功能

因此,您需要返回一个
Promise
对象,以便您的
异步函数处理它(您也可以使用另一个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();

    });

}

您还没有将
setBattery
的逻辑包装在promise.ok中。我以前没有使用过承诺。async/await是使用承诺的工具,要理解async/await,您需要理解承诺。此外,向函数定义添加async会将该函数的返回类型更改为承诺,因此需要处理该承诺。类似于
exports.handler(a,b).then(()=>{}).catch(()=>{}).finally(()=>{})
“如果我删除wait/async并使其同步,我的函数就会正常工作。”为什么你希望它是异步的?我正在尝试向Alexa smart home skill lambda函数添加一个http get调用,并且大部分代码都是异步的。