Objection.js 查询构建器如何知道何时应该执行链式调用?

How does Objection.js query builders know when a chained call is supposed to be executed?

来自 docs

中的示例

await User.query() returns 对大量用户的承诺。

await User.query().findById(1) returns ID为1的用户

User.query() 如何知道何时需要执行它或它是否被链接。

我假设一旦 User.query() 被调用,请求已经传输到数据库服务器,因此无法修改。但是,将其与 .findById(1) 链接会修改请求,以便它构建条件为 User.id = 1; 的查询,然后将其传输到数据库服务器?。它是如何工作的?

User.query() returns 一个查询生成器,可以在其中添加任意数量的链式方法调用:

query = User.query();
query.where('id', 1);
query.limit(1);

// also each method returns `this` as return value so chaining is possible

query.select('id', 'name').where('name', 'like', '%batman%')

现在查询已完成,您想要执行查询生成器并将查询发送到您需要调用 .then() 的数据库,或者例如使用 Promise.resolve(query) 解析它,这会隐式调用查询生成器的.then 方法。

在您的情况下,您使用 await 来触发查询,这实际上只是 ´Promise.resolve`

的语法糖

以下执行查询的所有示例都非常等效


// await with parenthesis underlining execution order of statements
res = await (User.query().select('name'));

// await without parenthesis with implicit execution order
res = await User.query().select('name');

// older way with thenables and promises
User.query().select('name').then(res => {
})

// another way with themables and promises
Promise.resolve(User.query().select('name')).then(res => {

})

所以上述所有情况都调用查询构建器的 .then 方法来执行查询和 .then returns 一个承诺,它将根据从数据库读取的结果进行解析。