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

时间:2018-04-15 17:54:50

标签: javascript asynchronous promise google-translate

我总是纠结于异步代码,我不知道我的错误在哪里。

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

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

1 个答案:

答案 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结果。