[英]When are knex.js queries “promises” executed/resolved?
使用常規的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在推遲執行計划的背后做了什么魔術?
僅當您在查詢對象上調用.then()
時,Knex才執行網絡I / O。 只要您尚未在查詢對象上調用.then()
,它就會簡單地鏈接並返回查詢對象而不是Promise。
await
關鍵字在內部調用Promise的.then()
方法,因此將await
與knex
查詢對象一起使用也會導致其返回promise。
它不會延遲執行。 而是由查詢對象(不是Promise) .then()
方法觸發執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.