javascript - knex.js 查询 "promises"何时执行/解析?

标签 javascript asynchronous promise knex.js

对于正常的 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() 方法,因此使用 awaitknex query builder 对象也会导致它返回一个 promise。

这不是推迟执行。相反,执行是由查询构建器对象的(不是 Promise).then() 方法触发的。

关于javascript - knex.js 查询 "promises"何时执行/解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57758800/

相关文章:

javascript - 如何使用 Angular 1.5 服务

javascript - 组合 JavaScript 函数

javascript - 我怎样才能重写这些 JavaScript promise 而不那么复杂?

javascript - 让代码等待 AJAX 请求完成

mysql - nodejs Promises操作中的事务管理

javascript - 是否可以在 SVG 元素内附加一个 div?

javascript - TypeError : Cannot read property 'then' of undefined. 当我尝试运行 updatefirst 函数时出现此错误

angular - 从 Firestore 获取文档时的错误处理

javascript - 有没有正确的方法来存储已解决的 promise ?

javascript - 下拉菜单,选择一项时调用一个函数,选择另一项时调用另一个函数