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

时间:2019-09-02 14:36:38

标签: 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这样的查询构建器?似乎没有办法阻止诺言的履行?

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) // ???

上面会发生什么,此外,我如何甚至防止这种情况发生?毕竟,始终允许节点尽快解决诺言,所以仅链接点就可以使它解决?

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

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

1 个答案:

答案 0 :(得分:2)

仅当您在查询对象上调用using System; [AttributeUsage(AttributeTargets.All)] public class X: Attribute {} [AttributeUsage(AttributeTargets.All)] public class XAttribute: Attribute {} [X] // Error: ambiguity class Class1 {} [XAttribute] // Refers to XAttribute class Class2 {} [@X] // Refers to X class Class3 {} [@XAttribute] // Refers to XAttribute class Class4 {} 时,Knex才执行网络I / O。只要您没有在查询对象上调用.then(),它就会简单地链接并返回查询对象而不是Promise。

.then()关键字在内部调用Promise的await方法,因此,将.then()await查询对象一起使用也会使它返回承诺。

它不推迟执行。而是由查询对象的(不是Promise)knex方法触发执行。