Node.JS 10.15,无服务器,lambda,在本地调用
示例A)可行:
export async function main(event) {
const marketName = marketIdToNameMap[event.marketId];
const marketObject = marketDirectory[marketName];
const marketClient = await marketObject.fetchClient();
const marketTime = await marketObject.getTime(marketClient);
console.log(marketTime);
}
示例B),并且有效:
export function main(event) {
const marketName = marketIdToNameMap[event.marketId];
const marketObject = marketDirectory[marketName];
marketObject.fetchClient().then((marketClient)=>{
marketObject.getTime(marketClient).then((result) => {
console.log('<---------------> marker 1 <--------------->');
console.log(result);
});
});
}
示例C),但这不是:
export async function main(event) {
const marketName = marketIdToNameMap[event.marketId];
const marketObject = marketDirectory[marketName];
const marketClient = await marketObject.fetchClient();
console.log('<---------------> marker 1 <--------------->');
marketObject.getTime(marketClient).then((result) => {
console.log('<---------------> marker 22 <--------------->');
console.log(result);
});
}
对于所有示例而言,getTime的精髓都是
function getTime(marketClient){
return new Promise((resolve, reject) => {
return marketClient.getTime((err, result) => {
if (err) {
reject(err);
}
resolve(result);
});
}).catch(err => {
throw err;
});
}
显然,将异步/唤醒与经典的promise then-ables混合似乎是一个问题。我会期望来运行示例C,因为getTime()返回了一个Promise。但是,代码只是简单地静默完成,而不会碰到第二个标记。我必须将第一个标记放在那里,以确保所有代码都可以运行。感觉我应该能够将async / await和thenables混合使用,但是我一定不能在这里考虑一些东西。
答案 0 :(得分:3)
您既没有等待也没有从marketObject.getTime().then()
返回诺言,这将导致诺言链独立执行,主函数返回并关闭进程。请记住。then
也会返回一个承诺。
解决方案是
await marketObject.getTime(marketClient).then(...
或
return marketObject.getTime(marketClient).then(...
这两种方式都会将诺言链接到主函数,以便无论执行什么,它都会始终等待所有诺言得以解决(或拒绝)。
我怀疑示例B起作用,因为主要对象不是异步的,Lambda将等待事件循环完成。即即使主要客户提前归还,它也会执行承诺链。
https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html
如果您未在代码中使用回调,则AWS Lambda将调用它 隐式地,返回值为null。当回调被调用时, AWS Lambda继续执行Lambda函数,直到事件发生 循环为空。
...并且我怀疑您是否返回Promise(如示例C中所做的那样),那么Lambda会在解决后立即立即终止该过程,这是因为您不等待/返回{{1} }链,因此您创建的浮动承诺链将不会执行。