对于正常的 promise ,一旦当前代码停止, promise 将尽快解决。考虑以下伪代码:
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 尽快解析 promise,所以只需链接点就可以让它解析?
const p = knex.select('*').from('table').limit(5);
let q = knex.select('*');
q = q.from('table');
q = q.limit(5);
或者 knex 在推迟执行计划的背后做了什么魔术?
最佳答案
Knex 查询生成器不是 Promise,而是 Promise/A+ 规范调用 thenable
的东西。
当您在查询构建器对象上调用 .then()
时,Knex 仅执行网络 I/O。只要您没有在查询构建器对象上调用 .then()
,它就会简单地链接并返回一个查询构建器对象,而不是 Promise。
await
关键字解析查询生成器并在内部调用其 .then()
方法,因此使用 await
和 knex
query builder 对象也会导致它返回一个 promise。
这不是推迟执行。相反,执行是由查询构建器对象的(不是 Promise).then()
方法触发的。
关于javascript - knex.js 查询 "promises"何时执行/解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57758800/