我是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
。
我该怎么做?
答案 0 :(得分:2)
saveLineIntoDb
不返回结果,而是将async
和原始承诺混合在一起。它还可以防止在调用方函数中处理错误。 return await (user)
过多,它也不起作用,因为它发生在常规函数中。
应该是:
async function saveLineIntoDb(user) {
await db.result(pgp.helpers.insert(user, cs));
return user;
}
虽然调用方函数未链接诺言,并且未使用await
。如果数据库查询应按顺序执行,则应为:
async function makeLineStringFromPoints(user) {
...
try {
for (let item of linesGeoJson) {
const userStored = await saveLineIntoDb(...);
console.log(userStored);
}
} catch (err) {
console.log(err);
}
}
如果应并行执行数据库查询,则应为:
async function makeLineStringFromPoints(user) {
...
try {
await Promise.all(linesGeoJson.map(async (item) => {
const userStored = await saveLineIntoDb(...));
console.log(userStored);
}));
} catch (err) {
console.log(err);
}
}
答案 1 :(得分:1)
您为什么要在然后返回用户?可能可以通过这种方式完成
async function saveLineIntoDb(user) {
let userStored = user;
try {
await db.result(pgp.helpers.insert(user, cs));
return user; // return user
} catch (error) {
logger.error('saveIntoDatabase Error:', error);
}
}
答案 2 :(得分:0)
在saveLineIntoDb
方法中,尝试返回await
的结果:
async function saveLineIntoDb(user) {
let userStored = user;
try {
return await db.result(pgp.helpers.insert(user, cs))
.then(data => {
return await (user); // return user
});
} catch (error) {
logger.error('saveIntoDatabase Error:', error);
}
}
(此功能,您无需使用async/await
)