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...
使用 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...