Javascript 如何:在node.js lambda函数中等待/异步?
我正在尝试创建一个异步lambda函数,使httpGet调用put无法正常工作,我相信这与异步有关。如果删除wait/async,并使其同步,我的函数将正常工作。我不确定我做错了什么。谢谢你的帮助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,
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调用,并且大部分代码都是异步的。