使用 Google 翻译 API 的异步翻译。我究竟做错了什么?

Asynchronous translation with Google Translate API. What am I doing wrong?

总是被异步代码纠结,不知道自己的错误在哪里。

此代码从数据库中读取产品名称并将它们放入 untranslated 数组中。之后,遍历数组,翻译每个项目,并推入新的 translated 数组。

SQL 部分工作正常,但不幸的是,translated 数组是空的。我正在使用 mssql and 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();
});

这应该让你继续:

Promise.all(untranslated.map(item => translate(item, { from: 'mk', to: 'en' })))
  .then(translated => console.log(translated));

在您的原始代码中,您调用了 translate,returns 是一个 Promise。 Promise 最终 实现或拒绝。但是,您创建了很多承诺,然后继续立即打印 translated。此时,Promises 还没有实现。

这就是 Promise.all 的用武之地。我们没有为单个承诺调用 then,而是将它们全部传递给 Promise.all,如果所有承诺都已解决并包含所有 Promise 结果的数组。