You need to enable JavaScript to run this app. 如何让quick.db读取异步执行,实现先输出finish后输出done?
优惠活动
大模型
产品
解决方案
定价
更多

如何让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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 11:00:02