knex.js 查询“承诺”何时执行/解决?

pau*_*l23 3 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
Run Code Online (Sandbox Code Playgroud)

但是,这如何转换为像 knex 这样的查询构建器?似乎没有办法阻止承诺的执行?

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) // ???
Run Code Online (Sandbox Code Playgroud)

上面会发生什么,以及我如何进一步防止这种情况发生?毕竟总是允许节点尽快解决承诺,所以只是链接点可以让它解决吗?

const p = knex.select('*').from('table').limit(5); 
let q = knex.select('*');
q = q.from('table');
q = q.limit(5);
Run Code Online (Sandbox Code Playgroud)

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

sle*_*man 7

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

await关键字内部调用一个无极的.then()方法,因此使用awaitknex查询对象也将导致它返回一个承诺。

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

  • 请注意,“Promise.all()”与“await”一样,调用事物的内部“.then()”方法,因此会意外/巧合地将 kenx 查询对象转换为 Promise。根据您的数据库服务器配置,查询可能是并行的,也可能在数据库中排队,但 javascript 将同时执行(而不是顺序),因为 `Promise.all()` 不会等待一个查询完成后再调用另一个查询 (2认同)