zen*_*inc 5 javascript node.js async-await es6-promise serverless
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);
}
Run Code Online (Sandbox Code Playgroud)
样本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);
});
});
}
Run Code Online (Sandbox Code Playgroud)
样本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);
});
}
Run Code Online (Sandbox Code Playgroud)
对于所有示例,getTime的实质是:
function getTime(marketClient){
return new Promise((resolve, reject) => {
return marketClient.getTime((err, result) => {
if (err) {
reject(err);
}
resolve(result);
});
}).catch(err => {
throw err;
});
}
Run Code Online (Sandbox Code Playgroud)
显然,将异步/唤醒与经典的promise then-ables混合似乎是一个问题。我希望 SAMPLE C可以工作,因为getTime()返回了一个Promise。但是,代码只是简单地静默完成,而不会碰到第二个标记。我必须将第一个标记放在那里,以确保所有代码都可以运行。感觉我应该能够混合async / await和thenables,但是我一定不能在这里考虑。
您既不等待也不返回来自 的承诺marketObject.getTime().then(),这将导致该承诺链独立执行,主函数返回并且进程关闭。记住..then也返回一个承诺。
解决方案是
await marketObject.getTime(marketClient).then(...
Run Code Online (Sandbox Code Playgroud)
或者
return marketObject.getTime(marketClient).then(...
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,都会将承诺链接到主函数,以便无论执行什么,它都会始终等待所有承诺解决(或拒绝)。
我怀疑示例 B 有效,因为 main 不是异步的,并且 Lambda 将等待事件循环完成。即,即使 main 提前返回,它也会执行承诺链。
https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html
如果您不在代码中使用回调,AWS Lambda 将隐式调用它并且返回值为 null。调用回调时, AWS Lambda 继续 Lambda 函数调用,直到事件循环为空。
...我怀疑如果你返回一个 Promise(就像在示例 C 中所做的那样),那么 Lambda 将在解析后立即终止该进程,这是因为你不等待/返回链.then(),因此浮动的 Promise您创建的链将不会执行。
| 归档时间: |
|
| 查看次数: |
324 次 |
| 最近记录: |