Node.js导出数组未填充问题求助
问题分析:调用Fact.init()后Fact.facts仍为空的原因
你遇到的问题由两个核心原因导致:
1. 异步代码的执行时序问题
你的SelectAll函数通过回调函数传递结果,回调逻辑会在当前事件循环结束后才执行。而server.js中调用Fact.init()后立刻打印Fact.facts,此时回调还未触发,facts还是初始的空数组。
实际执行顺序:
Fact.init()调用loadFactsloadFacts调用SelectAll,同步打印SelectAll: ...- 直接跳出
SelectAll、loadFacts、init,回到server.js执行console.log("Server.js: ...") - 事件循环空闲后,才执行
SelectAll里的回调,把facts赋值为messages并打印loadFacts: ...
2. 变量引用被覆盖,导出的数组和内部赋值的数组不是同一个
一开始exports.facts = facts是指向初始空数组的引用,但在回调里执行facts = messages时,是把facts变量重新赋值为一个新的数组引用,而exports.facts仍然指向原来的空数组,所以外部访问Fact.facts永远拿不到新赋值的数据。
修复方案
解决引用覆盖问题
不要直接给facts重新赋值,而是修改原数组的内容:
// 把回调里的 facts = messages; 改成: facts.splice(0, facts.length, ...messages);
这样exports.facts指向的还是原来的数组引用,只是内部内容被替换了。
解决异步时序问题
让init方法返回Promise,确保外部可以等待数据加载完成:
// Fact.js 修改init和loadFacts function init() { return new Promise(resolve => { loadFacts(resolve); }); } function loadFacts(resolve) { if (facts.length === 0) { SelectAll(function (messages) { facts.splice(0, facts.length, ...messages); console.log("loadFacts: " + JSON.stringify(facts)); resolve(); }); } else { resolve(); } }
然后在server.js中等待初始化完成再打印:
// server.js async function startServer() { await Fact.init(); console.log("Server.js: " + JSON.stringify(Fact.facts)); } startServer();
内容的提问来源于stack exchange,提问作者Anton Schrage
相关产品推荐
相关产品推荐

