为什么knex迁移示例将Promise构造函数作为第二个参数传递?

时间:2017-03-02 00:41:00

标签: javascript node.js knex.js

Knex使用迁移文件来应用或回滚数据库结构更改。例如,要创建新的迁移文件,可以使用cli:

knex migrate:make migration_name

这会在/migrations目录中生成一个包含以下内容的文件:

exports.up = function(knex, Promise) {

};

exports.down = function(knex, Promise) {

};

我的问题是,为什么这会将Promise作为参数传递?我看到knex大量使用Bluebird和passes Promise to the migration。那么,这是否是前任Promise无处不在的遗迹?或者......是否故意覆盖es6实现,以便它可以使用非标准方法,如tapspread

非常感谢任何清晰度。

2 个答案:

答案 0 :(得分:1)

如果我没记错的话,最初是在那里添加的,因为es5没有全局Promise对象。

这不是一个记录在案的功能,但目前传递给迁移脚本的Promisebluebird承诺(https://github.com/tgriesser/knex/blob/master/src/migrate/index.js#L327)。

但是,对于未来兼容性,最安全的选择是从bluebird导入承诺,而不是使用传递给迁移的承诺,如果您想使用bluebird中的特殊功能。

答案 1 :(得分:-1)

promises的主要好处是能够捕获抛出的错误而不会崩溃节点应用程序,使得代码在同步代码中的行为类似于.try / .catch /。最终。

knex.select('name')
.from('users')
.where('id', '>', 20)
.andWhere('id', '<', 200)
.limit(10)
.offset(x)
.then(function(rows) {
  return _.pluck(rows, 'name');
})
.then(function(names) {
  return knex.select('id').from('nicknames').whereIn('nickname', names);
})
.then(function(rows) {
  console.log(rows);
})
.catch(function(error) {
  console.error(error)
});

参考:http://knexjs.org/#Interfaces-Promises