为什么我的承诺链失败了?

时间:2015-03-22 16:27:39

标签: javascript promise bluebird knex.js

我尝试使用knex为数据库播种。在贡献者的帮助下,我成功地在一张桌子上播种了我需要采取的几个步骤:

  1. 我需要从几个外部表中提取id值,这样我就可以填充种子表的外键值。
  2. 在种子表中生成 n 记录。
  3. 填充表格。
  4. 如前所述,我有一个工作表。因为我比一个屋顶大头钉更聪明并且必须为另一个桌子做几乎完全相同的事情,所以我只是复制了第一个种子文件中的工作,将其放入第二个种子文件中,做了几个适当的修改(具体来说,在第二个表中我只需要填充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(...)方法。

    更新

    无论它的价值如何,这都是.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' }
    

1 个答案:

答案 0 :(得分:1)

您在spread的结果中使用Promisemap的方法。

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);
});