Mir wurde gesagt, dass es keine Garantie in der Reihenfolge gibt, in der ein Promise.all seine Versprechungen löst. Ich sehe jedoch nicht, dass es sich nicht in der Reihenfolge von der Promise.all native docs löst.Alle Rennbedingungen mit Knex Migrationen versprechen
Daher sollte der folgende Ansatz für Knex-Migrationen nicht funktionieren, da messages
einen Verweis auf Benutzer Tabelle hat.
Dennoch habe ich noch nie eine Instanz von mehreren Migrationen gesehen, bei denen ein Fehler mit einer Race Condition aufgetreten ist. Das heißt, es scheint, als ob Promise.all je nach Indexposition aufgelöst wird.
Also, meine Frage ist: ist das folgende Schnipsel anfällig für eine Race Condition?
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');
}),
Und ist das der bessere Ansatz?
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');
}),
});
})
Sie müssen "Promise.all" nicht in Ihrem zweiten Snippet verwenden. – 4castle
Angenommen, dies sind XHR-Aufrufe, werden sie initiiert, sobald Sie den Funktionsumfang verlassen.Dies bedeutet, dass die XHR-Anforderungen gleichzeitig ausgeführt werden. Es kann sein, dass Sie Glück haben und die Reihenfolge der Anfragen genau so ist, wie Sie es wollen, aber wenn 'createTable ('Benutzer') 'vor' createTable ('Nachrichten') 'ausgeführt werden muss, dann Sie sollte ein '.then()': 'knex.schema.createTable ('users', ...) verwenden, dann (() => {knex.schema.createTable ('messages')});'. –