knex.js 什么时候查询 "promises" executed/resolved?

When are knex.js queries "promises" executed/resolved?

对于正常的承诺,一旦当前代码停止,承诺将尽快解决。考虑以下伪代码:

const p = SomePromiseDoingLoad();
calculatethings();
await sleepPromise();
//during sleep the promise p might/will have resolved already.
await p; //awaiting just makes *sure* the promise is already executed

然而,这如何转化为像 knex 这样的查询构建器?好像没有办法阻止promise的执行?

const p = knex.select('*').from('table');
//p could be executed now already.
const data = await gatherDataFromWebsite();
//p most probably will have resolved??
p.limit(data.limit) // ???

上面会发生什么,以及我什至如何防止这可能发生?毕竟总是允许 Node 尽快解决承诺,所以只需链接点就可以让它解决?

const p = knex.select('*').from('table').limit(5); 
let q = knex.select('*');
q = q.from('table');
q = q.limit(5);

或者 knex 在推迟执行的计划背后做了什么魔术?

Knex 仅在您对查询对象调用 .then() 时执行网络 I/O。只要您没有在查询对象上调用 .then(),它就会简单地链接 return 查询对象而不是 Promise。

await 关键字在内部调用 Promise 的 .then() 方法,因此将 awaitknex 查询对象一起使用也会导致它成为 return promise .

不是延期执行。相反,执行是由查询对象的(不是 Promise).then() 方法触发的。