如何让quick.db读取异步执行,实现先输出finish后输出done?
问题根因
quick.db的默认db.get()是同步阻塞方法,执行时会占用JavaScript主线程,不会让出事件循环给其他代码执行。new Promise构造函数的回调(executor函数)本身是同步执行的,你在executor内部写的10000次循环调用同步db.get会直接阻塞整个主线程,代码会卡在循环执行阶段,不会往下走到console.log('finish'),直到整个循环执行完毕、触发resolve之后,才会继续执行后续的同步代码。- async/await仅对返回Promise的异步操作生效,你当前的
test函数内部没有真正的异步逻辑,所以await不会起到让出主线程的作用。
修复方案
你需要使用quick.db提供的异步API,同时在循环内给数据库操作加await,让每次IO操作时可以让出事件循环,优先执行后续的同步代码,即可达到先打印finish再打印done的预期:
const db = require('quick.db'); var balance = null; var items = null; final(); console.log('finish'); async function final() { var res = await test(); console.log('done'); } async function test() { for(var i=0; i<10000; i++) { // 调用quick.db异步API,加await让出事件循环 balance = await db.get('userInfo.balance') items = await db.get('userInfo.items') } return true; }
如果你的quick.db版本较低不支持原生异步调用,可以用Node.js内置的util.promisify工具将db.get转为返回Promise的异步方法,也可以实现相同效果。
内容的提问来源于stack exchange,提问作者Paul W.
相关产品推荐
相关产品推荐

