我被告知,Promise.all无法保证Promise.all能够解决其承诺。但是,我不知道它不能按照Promise.all native docs的顺序解决。用knex迁移承诺所有比赛条件
因此,下面的方法来knex迁移不应该工作,因为messages
有一个用户表的引用。
然而,我从来没有遇到过一次实例,在几次迁移中,出现了竞争条件的错误。意思是,好像Promise.all根据索引位置决定。
所以,我的问题是:下面的代码片段容易出现竞争状态吗?
return Promise.all([
knex.schema.createTable('users', function(table) {
table.increments().primary();
...
}),
knex.schema.createTable('messages', function(table) {
table.increments().primary();
table.bigInteger('user_id').unsigned().index()
.references('id').inTable('users');
}),
这是更好的方法吗?
return Promise.all([
knex.schema.createTable('users', function(table) {
table.increments().primary();
...
}),
]).then(function() {
return Promise.all([
knex.schema.createTable('messages', function(table) {
table.increments().primary();
table.bigInteger('user_id').unsigned().index()
.references('id').inTable('users');
}),
});
})
你不需要在你的第二个片段中使用'Promise.all'。 – 4castle
假设这些是XHR调用,它们将在您退出函数范围后立即启动。这意味着XHR请求将同时运行。这可能是因为你很幸运,请求的顺序完全按照你想要的方式完成,但是如果'createTable('users')'需要在'createTable('messages')'之前执行',那么你应该使用'.then()':'knex.schema.createTable('users',...)。then(()=> {knex.schema.createTable('messages')});'。 –