我试图遍历数组以获取值并搜索数据库,然后将数据库结果连接到字符串翻译
app.get('/translate',function(req,res) {
let translate = '';
['hello','love'].forEach(async (word) => {
let trans = await
NaijaLang.find({"engword": word, "naijalang": "yoruba"});
translate +=" " + trans[0].translation;
//Returns values
console.log(translate)
});
//Returns Empty String;
console.log(translate)
res.send(translate);
});
答案 0 :(得分:0)
因为您在此处执行了一些异步操作,但是您将值同步发送。基本上,此代码将按以下顺序运行:
let translate='';
['hello','love'].forEach(...)
await NaijaLang.find(...)
await NaijaLang.find(...)
console.log(translate)
和res.send(translate);
await NaijaLang.find(...)
的值->这是translate
第一次更新的时间(对于word = hello或word = love。无论较早完成)await NaijaLang.find(...)
的值->这是translate
第二次更新的时间。但是该值已在第五步中发送。 您可以在此处找到更详细的说明:https://blog.lavrton.com/javascript-loops-how-to-handle-async-await-6252dd3c795
您还可以在此处找到解决方法。您可以使用for-of循环代替forEach:
app.get('/translate',function(req,res){
let translate='';
for (let word of ['hello','love']) {
let trans=await NaijaLang.find({"engword":word,"naijalang":"yoruba"});
translate+=" " + trans[0].translation;
//Returns values
console.log(translate)
}
//Returns Empty String;
console.log(translate)
res.send(translate);
});
这一次,代码将按您希望的那样执行。首先,将为word = hello调用find
方法,然后,在执行完成后,将为word = love调用find
方法,最后两次调用完成后,{{ 1}}。