我被告知,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')});'。 –