使用常规的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在做什么魔术?
答案 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
方法触发执行。