我总是纠结于异步代码,我不知道我的错误在哪里。
此代码从数据库中读取产品名称并将其放入untranslated
数组中。之后,迭代数组,翻译每个项目,并推送到新的translated
数组中。
SQL部分工作正常,但遗憾的是,translated
数组为空。我正在使用mssql和translate npm包。
我该如何做到这一点?
var untranslated = [];
var translated = [];
var query = `select name from products`
new sql.ConnectionPool(db).connect().then(pool => {
return pool.request().query(query)
}).then(result => {
for (var i = 0; i < result.recordset.length; i++) {
var item = result.recordset[i];
untranslated.push(item.name)
}
// I'm messing it up here somewhere.
untranslated.map(item => {
translate(item, { from: 'mk', to: 'en' }).then(result => {
translated.push(result);
})
})
console.log(translated); // Logs [];
}).catch(err => {
console.log(err);
sql.close();
});
答案 0 :(得分:2)
这应该让你前进:
Promise.all(untranslated.map(item => translate(item, { from: 'mk', to: 'en' })))
.then(translated => console.log(translated));
在原始代码中,您调用translate
,后者返回Promise。承诺最终履行或拒绝。但是,您创建了许多承诺,然后继续立即打印translated
。在这一点上,承诺尚未实现。
这是Promise.all
的来源。我们将所有这些都传递给then
,而不是为Promise.all
调用{{1}},如果所有承诺都已解析并包含数组,则会解析{{1}}所有Promise结果。