NodeJS Async/Await 不等待(returns 未决承诺)
NodeJS Async/Await doesn't await (returns Promise pending)
我正在写一个 API 来获取用户在 Stellar 网络上的过去交易,在我的数据库中查找相应的用户,然后将它们全部放在一个 JSON 中(以响应请求 - 稍后)。
问题:查找accountID对应的用户名("from"字段)是mongoose的异步方法,只有JSON组装后的数据returns
我尝试使用 async/await、promises、.then 但似乎没有任何效果。
server.payments()
.forAccount(accountId)
.cursor('now')
.order('desc')
.limit(2)
.call()
.then(function (page) {
var history = []
for(var i = 0; i<page.records.length; i++){
var obj = page.records[i]
//Get the username corresponding to the key from my database
//FIXME
var username
findUser(obj["from"]).then(result => {
username = result
})
var payment = {
"currency":obj["asset_code"],
"from": obj["from"],
"username":username,
"amount": obj["amount"],
"timestamp":obj["created_at"]
}
history.push(payment)
}
console.log(history)
//console.log(JSON.stringify(history))
})
.catch((err) => {
console.log(err)
})
async function findUser(senderKey){
var user = await mongoose.User.findOne({publicKey: senderKey})
console.log(user.username)
return user.username
}
预期结果:找到用户 returns 值,付款变量使用它并一起记录。
发生了什么:findUser 开始寻找数据,付款变量被放在一起(用户名未定义)并记录下来,findUser returns 数据。
这是日志:(spiderman 是我数据库中的实际用户名)
[ { currency: 'MEUR',
from: 'GACRQARPR2OMWRG6IH7HM5DYTA3FMM6UKA7NKS4BIJIADRIKFRPAIE7G',
username: undefined,
amount: '3.0000000',
timestamp: '2019-05-07T13:37:04Z' },
{ currency: 'MEUR',
from: 'GACRQARPR2OMWRG6IH7HM5DYTA3FMM6UKA7NKS4BIJIADRIKFRPAIE7G',
username: undefined,
amount: '2.0000000',
timestamp: '2019-05-07T13:34:21Z' } ]
spiderman
spiderman
您可以使用新的 "for of" 循环和异步等待 :-
server.payments()
.forAccount(accountId)
.cursor('now')
.order('desc')
.limit(2)
.call()
.then(async function (page) {
var history = []
for(const obj of page.records) {
const username = await findUser(obj["from"]);
var payment = {
"currency":obj["asset_code"],
"from": obj["from"],
"username":username,
"amount": obj["amount"],
"timestamp":obj["created_at"]
}
history.push(payment)
}
console.log(history)
//console.log(JSON.stringify(history))
})
.catch((err) => {
console.log(err)
})
Highlight 推荐,你可以使用 async/await
语法来简化你的案例。
您将 wait
直到服务器响应 page
,然后 page.records
中的每个 obj
(.map
或 .forEach
。 .. 会让你变得一团糟),你 wait
为 findUser
函数 returns username
,然后做你的事。
try {
const page = await server.payments()
.forAccount(accountId)
.cursor('now')
.order('desc')
.limit(2)
.call()
const history = [];
for (const obj of page.records) {
const username = await findUser(obj["from"]);
const payment = {
"currency": obj["asset_code"],
"from": obj["from"],
"username": username,
"amount": obj["amount"],
"timestamp": obj["created_at"]
}
history.push(payment)
}
console.log(history)
} catch (e) {
console.log(e)
}
提醒:await
表达式只能在 async
函数中使用。
您需要一个条件来检查您正在等待的功能是否已完成
async function findUser(senderKey){
var user = await mongoose.User.findOne({publicKey: senderKey})
if (user){
console.log(user.username)
return user.username
}
}
我正在写一个 API 来获取用户在 Stellar 网络上的过去交易,在我的数据库中查找相应的用户,然后将它们全部放在一个 JSON 中(以响应请求 - 稍后)。
问题:查找accountID对应的用户名("from"字段)是mongoose的异步方法,只有JSON组装后的数据returns
我尝试使用 async/await、promises、.then 但似乎没有任何效果。
server.payments()
.forAccount(accountId)
.cursor('now')
.order('desc')
.limit(2)
.call()
.then(function (page) {
var history = []
for(var i = 0; i<page.records.length; i++){
var obj = page.records[i]
//Get the username corresponding to the key from my database
//FIXME
var username
findUser(obj["from"]).then(result => {
username = result
})
var payment = {
"currency":obj["asset_code"],
"from": obj["from"],
"username":username,
"amount": obj["amount"],
"timestamp":obj["created_at"]
}
history.push(payment)
}
console.log(history)
//console.log(JSON.stringify(history))
})
.catch((err) => {
console.log(err)
})
async function findUser(senderKey){
var user = await mongoose.User.findOne({publicKey: senderKey})
console.log(user.username)
return user.username
}
预期结果:找到用户 returns 值,付款变量使用它并一起记录。
发生了什么:findUser 开始寻找数据,付款变量被放在一起(用户名未定义)并记录下来,findUser returns 数据。
这是日志:(spiderman 是我数据库中的实际用户名)
[ { currency: 'MEUR',
from: 'GACRQARPR2OMWRG6IH7HM5DYTA3FMM6UKA7NKS4BIJIADRIKFRPAIE7G',
username: undefined,
amount: '3.0000000',
timestamp: '2019-05-07T13:37:04Z' },
{ currency: 'MEUR',
from: 'GACRQARPR2OMWRG6IH7HM5DYTA3FMM6UKA7NKS4BIJIADRIKFRPAIE7G',
username: undefined,
amount: '2.0000000',
timestamp: '2019-05-07T13:34:21Z' } ]
spiderman
spiderman
您可以使用新的 "for of" 循环和异步等待 :-
server.payments()
.forAccount(accountId)
.cursor('now')
.order('desc')
.limit(2)
.call()
.then(async function (page) {
var history = []
for(const obj of page.records) {
const username = await findUser(obj["from"]);
var payment = {
"currency":obj["asset_code"],
"from": obj["from"],
"username":username,
"amount": obj["amount"],
"timestamp":obj["created_at"]
}
history.push(payment)
}
console.log(history)
//console.log(JSON.stringify(history))
})
.catch((err) => {
console.log(err)
})
Highlight 推荐,你可以使用 async/await
语法来简化你的案例。
您将 wait
直到服务器响应 page
,然后 page.records
中的每个 obj
(.map
或 .forEach
。 .. 会让你变得一团糟),你 wait
为 findUser
函数 returns username
,然后做你的事。
try {
const page = await server.payments()
.forAccount(accountId)
.cursor('now')
.order('desc')
.limit(2)
.call()
const history = [];
for (const obj of page.records) {
const username = await findUser(obj["from"]);
const payment = {
"currency": obj["asset_code"],
"from": obj["from"],
"username": username,
"amount": obj["amount"],
"timestamp": obj["created_at"]
}
history.push(payment)
}
console.log(history)
} catch (e) {
console.log(e)
}
提醒:await
表达式只能在 async
函数中使用。
您需要一个条件来检查您正在等待的功能是否已完成
async function findUser(senderKey){
var user = await mongoose.User.findOne({publicKey: senderKey})
if (user){
console.log(user.username)
return user.username
}
}