如何从Neo4j获取数据并在函数外部使用该数据?
解决Neo4j数据无法从回调函数返回的问题
你的问题核心在于Neo4j驱动的查询操作是异步执行的,onNext回调是在数据库返回数据时才触发,而你的receiveDataFromDB函数是同步执行的——函数会在异步查询完成前就执行完毕,所以直接return拿不到结果;同时onNext回调的返回值不会被外层函数捕获,强行return只会报错。
解决方案:用Promise封装异步查询
将整个查询逻辑包裹在Promise中,在onNext里收集数据,查询完成时通过resolve返回结果,出错时通过reject抛出异常。
修正后的代码示例
function receiveDataFromDB() { return new Promise((resolve, reject) => { const session = driver.session(); const collectedData = []; session.run('MATCH (n) RETURN n') .subscribe({ onNext: record => { const node = record.get('n'); console.log(node); // 保留控制台打印逻辑 collectedData.push(node); // 逐步收集每条返回的数据 }, onCompleted: () => { session.close(); resolve(collectedData); // 查询完成后统一返回所有数据 }, onError: error => { session.close(); reject(error); // 出错时返回异常信息 } }); }); }
如何在外部使用返回的数据
通过async/await或者.then()的方式处理Promise:
// 方式1:使用async/await(代码更简洁易读) async function processData() { try { const data = await receiveDataFromDB(); // 在这里处理拿到的数据 console.log("外部获取到的数据:", data); } catch (err) { console.error("数据获取失败:", err); } } processData(); // 方式2:使用.then()链式调用 receiveDataFromDB() .then(data => { console.log("外部获取到的数据:", data); // 编写数据处理逻辑 }) .catch(err => { console.error("数据获取失败:", err); });
为什么onNext里return会报错?
subscribe方法的onNext回调仅用于处理单条返回记录,设计上不需要返回值。你在其中return的内容不会被任何逻辑捕获,反而可能因为违背回调的预期设计导致运行时错误——正确的做法是在回调内收集数据,等整个查询完成后统一返回。
内容的提问来源于stack exchange,提问作者Mama africa
相关产品推荐
相关产品推荐

