javascript - Knex 在 for 循环内 promise

标签 javascript node.js asynchronous io knex.js

我是 Node/异步编码的新手,我意识到这是一个基本问题,涉及到我所缺少的一些基础知识,但对于我来说,我只是无法理解它应该如何工作。我使用 knex 为数据库做种,方法是从 CSV 中读取数据并在 for 循环中迭代行。在该循环中,我需要查询数据库中的另一个表并返回关联值作为要创建的新行的一部分。

据我所知,knex 返回一个待处理的 Promise,因此它还无法访问返回的值。但我似乎无法使用 async/awaitPromise.all 获得正确的结构;我根据我见过的其他答案尝试了很多方法,但似乎没有一个方法能够很好地解释正在发生的事情,以至于我可以成功地将其应用到我的案例中。非常感谢任何帮助。

我的seed 文件当前如下所示:

exports.seed = function(knex) {
  const fs = require('fs');

  function createImage(row, event_id) {
    return {
      name: row[1],
      event_id: event_id
    }
  };

  function get_event_id(loc) {
    knex('events')
      .where({location: loc})
      .first()
      .then(result => {console.log(result)});    // <-- this never executes
  };

    let images = [];

    const file = fs.readFileSync('./data.csv');
    const lines = file.toString().replace(/[\r]/g, '').split('\n');

    for (i=1; i<lines.length; i++) {
      var row = lines[i].split(',');

      var event_id = (async function () { return await get_event_id(row[0]) }) ();

      images.push(createImage(row, event_id));

      };

    console.log(images);
    // Inserts seed entries
    // return knex('table_name').insert(images);

};

输出: [ { name: '003.jpg', event_id: undefined } ]

我的data.csv的结构如下:

Location,Name
Amsterdam,003.jpg,
...

最佳答案

您可以将 for 循环更改为 Array.map 并在返回的 Promise 上使用 Promise.all

此外,seed 将返回一个 promise ,因此请正确调用它

exports.seed = async function (knex) {
    const fs = require('fs');

    function createImage(row, event_id) {
        return {
            name: row[1],
            event_id: event_id
        }
    };

    function get_event_id(loc) {
        return knex('events')
            .where({ location: loc })
            .first()
            .then(result => { console.log(result); return result });    // <-- this never executes
    };


    const file = fs.readFileSync('./data.csv');
    const lines = file.toString().replace(/[\r]/g, '').split('\n');

    let promises = lines.map(async (line) => {
        let [row] = line.split(',');
        let event_id = await get_event_id(row)
        return createImage(row, event_id)
    });

    let images = await Promise.all(promises);

    console.log(images);
    // Inserts seed entries
    // return knex('table_name').insert(images);
}; 

关于javascript - Knex 在 for 循环内 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59961874/

相关文章:

javascript - 如何在 Jest 中监视 window.scrollTo?

javascript - 如何获取连接的wifi网络名称

javascript - 链式 Promise 中的错误传播未按预期工作

layout - 在 Ring/Jetty 中自动重新加载代码

javascript - 如何从异步调用返回响应?

typescript :此表达式不可调用。类型 '{ getUserInfo(requestData: object): Promise<object>; }' 没有调用签名

javascript - 在某些情况下数组未填充

javascript - 预览内存中的内容 (javascript)

node.js - 在 mongodb 中更新时自动在子文档上添加对象 id

javascript - 使用 Underscore/Lodash 在 javascript 中执行非变异反尾的最佳方法