Nodejs:进程退出而承诺未决

Nodejs: process exits while promise is pending

使用 nodejs 12 的 lambda 函数摘录。 有一个承诺(aws dynamo db 文档客户端查询)嵌套在一个承诺(node-fetch API 请求)中。

第一个承诺工作正常。它执行请求,等待 promise 解决,然后进入 .then(...) 执行一些代码。接下来,它执行数据库查询,但随后它退出了整个函数而不等待 promise 解析,即使仍然有回调。它也不会抛出错误。 (我知道正在执行数据库查询,因为额外的日志记录显示它的状态为 <pending>

当我使用 await 尝试 var dbscan = await db.scan(...) 时,出现错误 await is only valid in async function。但是处理函数已经是异步的,等待正在为获取承诺工作。

问:如何在第一个 promise 的 .then(...) 中使用 await

问:为什么进程没有等到promise resolve就退出了?

exports.myhandler = async (event, context, callback) => {

    var response = await fetch(url, {... my options ...})
    .then(res  => res.text())
    .then(data => {
        // do some stuff with the data ...

        var dbscan = db.scan({...my params ...}).promise()
        .then(res => {
            // do some stuff with result ...
            callback(null, <some message>);
        }).catch(err => {
            console.log(err);
            callback(null, <some message>);
        }); 

    })
    .catch(error => {
    console.log('error', error); 
    callback(null, <some message>);
    }); 
}

您必须将 async 添加到要使用 await 的函数的开头。

.then(async(data) => {
  var dbscan = await ...
})

由于您已经在使用 async/await 语法,因此您不必决定使用 .then(..) 链。

您可以像这样展平大部分代码:

const response = await fetch(url, {... my options ...});
const data = await response.text();
// Do some stuff with the data...
const result = await db.scan({...my params ...});
// Do some stuff with the result...