javascript - 为什么我可以等待此代码但不能使用 .then?

标签 javascript node.js async-await es6-promise serverless

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);
}

SAMPLE 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 混合使用似乎是一个问题。我会期望 SAMPLE C 工作,因为 getTime() 正在返回一个 promise 。然而,代码只是静静地结束,从不击中第二个标记。我必须把第一个标记放在那里只是为了确保所有代码都运行了。感觉我应该能够混合使用 async/await 和 thenables,但我不能在这里考虑某些东西。

@adrian,不 enter image description here

最佳答案

您既不等待也不返回 marketObject.getTime().then() 的 promise ,这将导致该 promise 链独立执行,返回主函数并关闭进程。记住.. then 也返回一个 promise 。

解决办法是

await marketObject.getTime(marketClient).then(...

return marketObject.getTime(marketClient).then(...

无论哪种方式,都可以将 promise 链接到主要功能,这样无论执行什么,它都会始终等待所有 promise 解决(或拒绝)。

我怀疑示例 B 有效,因为 main 不是异步的,Lambda 将等待事件循环完成。即即使 main 提前返回,它也会执行 promise 链。

https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

If you don't use callback in your code, AWS Lambda will call it implicitly and the return value is null. When the callback is called, AWS Lambda continues the Lambda function invocation until the event loop is empty.

... 我怀疑如果您返回一个 Promise(就像您在示例 C 中所做的那样),那么 Lambda 将在它解析后立即终止该过程,这是因为您没有等待/返回 。 then() 链,因此您创建的 float promise 链将不会执行。

关于javascript - 为什么我可以等待此代码但不能使用 .then?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56015949/

相关文章:

javascript - 谷歌地图列表类似于 Airbnb

javascript - 解决猜词游戏中的 js 错误

javascript - express.js 文档

node.js - 如何使 Node 行读取器有条件地跳过行

c# - 将异步添加到方法签名是一项重大更改吗?

javascript - 如何使用 execCommand 设置新行?

javascript - RxJS:使用 Observable.create 时如何知道需要清理哪些内容

node.js - child_process.execFile 退出缓慢

c# - 上次。等待与线程一起工作吗?

c# - 转换方法以返回任务