2015-03-22 3 views
4

Я пытаюсь засеять базу данных с помощью knex. С помощью вкладчиком, я успешно высевают одну таблицу, где нужно сделать несколько шагов:Почему моя цепочка обещаний не работает?

  1. мне нужно вытащить значения идентификаторов из нескольких внешних таблиц, так что я могу заполнить значения внешнего ключа в таблицы ПОСЕВНОЙ в ,
  2. n записей в таблице посева.
  3. Заполните стол.

Как уже упоминалось, у меня это работает для одного стола. Поскольку я умнее, чем крыша, и мне нужно сделать почти то же самое для другой таблицы, я просто скопировал то, что работал в первом файле семени, упал в второй файл семени, сделал пару подходящих модификаций (в частности , во второй таблице мне нужно только заполнить 1 значение внешнего ключа на данный момент) и ... это не сработает.

Я в затруднении. Конечно, в этом коде есть какая-то глупость, но я не могу ее найти. Я пытаюсь засеять таблицу units, которую я должен заполнить значением properties.id.

exports.seed = function(knex, Promise) { 
    console.log('Seeding the %s table...', tableName); 

    Promise.resolve([ 
     'properties', 
    ]) 
    .map(function(table) { 
     // Pull foreign key values (property_id) 
     var ids = knex.select('id').from(table).pluck('id'); 

     // AT THIS POINT THE ids VARIABLE HAS A VALUE 

     return ids; 
    }) 
    .spread(function(properties) { 
     // BUT I NEVER SEE THIS LOG PRINT 
     console.log('SPREADING UNITS'); 
    }); 
}; 

Что я делаю неправильно? Я сбросил .catch() и .error() в эту вещь, но ничего не записывается в журнал. Каким-то образом я просто никогда не погружаюсь в метод .spread(...).

UPDATE

По какой-то стоит, это содержание .map метода, прежде чем он вернулся ...

{ client: 
    { Formatter: { [Function: Formatter_MySQL] super_: [Function: Formatter] }, 
    Raw: { [Function: Raw_MySQL] super_: [Object] }, 
    Transaction: { [Function: Transaction_MySQL] super_: [Object] }, 
    QueryBuilder: { [Function: QueryBuilder_MySQL] super_: [Object] }, 
    QueryCompiler: { [Function: QueryCompiler_MySQL] super_: [Function: QueryCompiler] }, 
    migrationConfig: { tableName: 'knex_migration', directory: './migrations' }, 
    seedConfig: { directory: './seeds' }, 
    Runner: { [Function: Runner_MySQL] super_: [Function: Runner] }, 
    connectionSettings: 
     { host: '127.0.0.1', 
     port: '3306', 
     user: 'root', 
     password: '', 
     database: 'realster', 
     timezone: 'UTC', 
     charset: 'utf8', 
     debug: false }, 
    Pool: { [Function: Pool_MySQL] super_: [Function: Pool] }, 
    databaseName: 'realster', 
    pool: { client: [Circular], config: [Object], genericPool: [Object] }, 
    _events: { start: [Function], query: [Function] }, 
    Seeder: { [Function: Seeder_MySQL] super_: [Function: Seeder] } }, 
    _single: { table: 'properties', pluck: 'id' }, 
    _statements: 
    [ { grouping: 'columns', value: [Object] }, 
    { grouping: 'columns', type: 'pluck', value: 'id' } ], 
    _errors: [], 
    _joinFlag: 'inner', 
    _boolFlag: 'and', 
    _notFlag: false, 
    and: [Circular], 
    _method: 'pluck' } 
+2

Вы используете '.spread()' это это Блюберд? –

+0

@SecondRikudo: 'spread' - это не только метод синей птицы. '.map' и' Promise.join' делают это скорее всего :-) – Bergi

+0

@Bergi Да, knex использует обещания синей птицы. –

ответ

1

Вы используете spread, который представляет собой метод Promise, в результат map.

map, вероятно, производит массив, который не имеет функции spread().

Кроме того, spread обычно получает обратный вызов с несколькими аргументами. Если вам нужен массив, просто используйте старый добрый then.

В целом, я думаю, ваш код должен выглядеть следующим образом:

var mapProperties = function(table) { 
    return knex.select('id').from(table).pluck('id'); 
}; 

Promise.resolve([ 
    'properties' 
]) 
.then(mapProperties) 
.then(function(properties) { 
    console.log(properties); 
}); 
+1

«карта» - это метод обещания, который дает * обещание для * массива. – Bergi

+0

Ницца. не знал об этом. – firstdoit