node.js - 异步返回对象并在nodejs中等待
问题描述
我是 Node.js 的新手,我有async
一个名为
async function makeLineStringFromPoints(user) {
...
for (let item of linesGeoJson) {
saveLineIntoDb({
'line': item,
'date': user.date_created,
'user_id': user.uid,
'device_id': user.devid,
}).then((userStored) => {
console.log(userStored); // i received undefined
}).catch((err) => {
console.log(err);
});
}
...
}
在此方法中,我在此方法中调用了其他异步方法saveLineIntoDb
,我将用户信息存储在数据库中:
async function saveLineIntoDb(user) {
let userStored = user;
try {
await db.result(pgp.helpers.insert(user, cs))
.then(data => {
return await (user); // return user
});
} catch (error) {
logger.error('saveIntoDatabase Error:', error);
}
}
现在存储后我想返回,user
但我总是得到。saveLineIntoDb(user)
}).then((userStored)
undefined
我怎样才能做到这一点 ?
解决方案
saveLineIntoDb
不返回结果并混合async
和原始承诺。它还可以防止在调用函数中处理错误。return await (user)
过多,它也不会起作用,因为它发生在常规函数中。
它应该是:
async function saveLineIntoDb(user) {
await db.result(pgp.helpers.insert(user, cs));
return user;
}
虽然调用者函数不链接承诺并且不使用await
. 如果 DB 查询应该串行执行,它应该是:
async function makeLineStringFromPoints(user) {
...
try {
for (let item of linesGeoJson) {
const userStored = await saveLineIntoDb(...);
console.log(userStored);
}
} catch (err) {
console.log(err);
}
}
如果 DB 查询应该并行执行,它应该是:
async function makeLineStringFromPoints(user) {
...
try {
await Promise.all(linesGeoJson.map(async (item) => {
const userStored = await saveLineIntoDb(...));
console.log(userStored);
}));
} catch (err) {
console.log(err);
}
}
推荐阅读
- gzip - Redshift UNLOAD Select Distinct 创建更大的 zip 文件 vs Select *?
- java - 如何获取 Firefox 构建 ID?
- regex - 选择具有可变文本长度的 CSV 特定列中的特定文本
- reactjs - 在 nextjs 中使用 reduxform 连接 redux reducer
- php - .htaccess ajax 的特殊规则例外?
- asp.net - asp.net mvc 脚本包不使用 https 呈现
- c++ - 减法中的意外输出
- .net - IIS 10 - 找不到文件或目录
- http - 406 Not Acceptable payload 的格式?
- google-oauth - 是否可以获取另一个用户的 ID 令牌?