Кнекс обещает внутри петлю - PullRequest
0 голосов
/ 29 января 2020

Я новичок в Node / асинхронном кодировании, и я понимаю, что это базовый c вопрос, который говорит о некоторых основах, которые мне не хватает, но я просто не могу понять, как это должно Работа. Я заполняю базу данных, используя knex, считывая данные из CSV и перебирая строки в for l oop. В этом l oop мне нужно запросить другую таблицу в базе данных и вернуть соответствующее значение как часть новой создаваемой строки.

Я понимаю, что knex возвращает ожидающий Promise, так что у него пока нет доступа к возвращенному значению. Но я не могу понять структуру правильно с async/await или Promise.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,
...

1 Ответ

1 голос
/ 29 января 2020

Вы можете изменить свое значение для l oop на Array.map и использовать Promise.all для возвращенных обещаний.

Также, seed вернет обещание, поэтому вызывайте его правильно

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);
}; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...