【问题标题】:Asynchronous translation with Google Translate API. What am I doing wrong?使用 Google Translate API 进行异步翻译。我究竟做错了什么?
【发布时间】:2018-04-15 17:54:50
【问题描述】:

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

此代码从数据库中读取产品名称并将它们放入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();
});

【问题讨论】:

    标签: javascript asynchronous promise google-translate


    【解决方案1】:

    这应该可以帮助您:

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

    在您的原始代码中,您调用translate,它返回一个Promise。 Promise最终被实现或拒绝。但是,您创建了很多 Promise,然后立即打印 translated。此时,Promise 尚未实现。

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

    【讨论】:

    • 是的,解决了它。谢谢你的解释。因此,如果我要将翻译放回数据库中,INSERT 语句需要位于 .then(translated =&gt; () =&gt; { // INSERTS }) 中,对吗?
    • 如果您需要一次全部插入,可以。否则你仍然可以使用单独的回调。
    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 2013-09-15
    • 2016-07-18
    • 2014-04-21
    • 2019-12-23
    • 2014-06-15
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多