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在推迟执行的计划背后做了什么魔术?
Knex 仅在您调用.then()查询对象时执行网络 I/O 。只要您没有调用.then()查询对象,它就会简单地链接并返回查询对象而不是 Promise。
该await关键字内部调用一个无极的.then()方法,因此使用await了knex查询对象也将导致它返回一个承诺。
这不是推迟执行。相反,执行是由查询对象的(不是 Promise).then()方法触发的。
| 归档时间: |
|
| 查看次数: |
1160 次 |
| 最近记录: |