[英]Why can I await this code but not use .then?
Node.JS 10.15,無服務器,lambdas,在本地調用
樣本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;
});
}
顯然,將async / awaits與經典的承諾混合似乎是一個問題。 我希望 SAMPLE C能夠正常工作,因為getTime()正在返回一個promise。 但是,代碼只是默默地完成,從不擊中第二個標記。 我必須把第一個標記放在那里,以確保任何代碼都運行。 感覺我應該能夠混合async / await和thenables,但我不能在這里考慮一些事情。
你既沒有等待也沒有從marketObject.getTime().then()
返回promise,這將導致該promise鏈獨立執行,main函數返回,進程關閉。 記住.. 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(就像你在Sample C中那樣),那么Lambda會在結束后立即終止進程,這是因為你沒有等待/返回.then()
鏈,並且因此,您創建的浮動保證鏈將不會執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.