对于正常的承诺,一旦当前代码停止,承诺就会尽快解决。考虑以下伪代码:
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) // ???
上面会发生什么,以及我该怎么办prevent这可能会发生吗?毕竟,节点总是被允许尽快解决承诺,所以仅仅链接点就可以让它解决?
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
.
Knex 仅在调用时执行网络 I/O.then()
在查询生成器对象上。只要你还没有打电话.then()
在查询构建器对象上,它将简单地链接并返回查询构建器对象而不是 Promise。
The await
关键字解析查询生成器并在内部调用其.then()
方法因此使用await
with a knex
查询构建器对象也会导致它返回一个承诺。
这并不是推迟执行。相反,执行是由查询构建器对象(而不是 Promise)触发的.then()
method.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)