gpt4 book ai didi

javascript - 通过 knex 迁移 promise 所有竞争条件

转载 作者:行者123 更新时间:2023-11-29 23:52:52 25 4
gpt4 key购买 nike

有人告诉我,无法保证 Promise.all 履行 promise 的顺序。但是,我没有看到它没有按照 Promise.all native docs 的顺序解析。 .

因此,以下 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');
}),
});
})

最佳答案

因为你有一个依赖关系,你需要先创建第一个表,然后才能在第二个表中引用它,你应该使用 then 方式。

Promise.all 是否会看到其 promise 按索引顺序解析,与 Promise.all 本身无关,但与传递的各个 promise 无关以它为论据。虽然您可以期望 JavaScript(而不是 Promise.all)按顺序评估参数列表,但您通常无法知道哪些 promise 将首先解析。这是由那些单独的 promise 决定的,而不是由 Promise.all 决定的。

在你的情况下,这些单独的 promise 做类似的事情,即创建一个表,你的数据库引擎可能会按顺序处理这些语句,没有并发,你可能在实践中看到 promise 总是按照你列出的顺序解决他们,但依赖它是不好的做法。

请注意,如果您将其中只有一个 promise 的数组传递给 Promise.all,您可以跳过 Promise.all 并应用 then 立即执行那个单一的 promise 。

关于javascript - 通过 knex 迁移 promise 所有竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42447851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com