簡體   English   中英

為什么我可以等待這段代碼但不能使用.then?

[英]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,但我不能在這里考慮一些事情。

@adrian,不 在此輸入圖像描述

你既沒有等待也沒有從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM