Node.js中如何将异步操作获取的数据通过module.exports从模块中导出?
问题解答:Node.js模块能否导出异步操作获取的数据
直接给出结论:你给出的现有写法没法直接导出myArray变量,但是可以通过调整写法实现导出异步获取的数据。
为什么现有写法无法导出
- 首先
myArray是fetchArray函数内部的局部变量,作用域仅限函数内部,哪怕是同步代码,外部也无法直接访问这个变量,更别说对外导出。 - 其次模块导出逻辑是同步执行的,而你示例中的异步操作需要5秒才会返回结果,执行导出动作的时候
myArray还未被赋值,自然拿不到正确的值。
可落地的实现方案
方案1:导出Promise,使用方自行await
直接把异步操作返回的Promise对外导出,导入方自己await获取结果即可:
// 导出模块文件(比如data.js) function sendArray() { return new Promise((resolve, reject) => { setTimeout(() => { resolve([1, 2, 3, 4]); }, 5000); }); } // 直接导出Promise实例 module.exports = sendArray();
导入使用示例:
// 引入模块的业务文件 const myArrayPromise = require('./data.js'); async function useArray() { const myArray = await myArrayPromise; // 此处即可正常使用异步获取到的数组 console.log(myArray); } useArray();
方案2:导出异步函数,使用方调用后await
也可以把封装好的异步获取方法直接导出,使用方调用后再await拿值:
// 导出模块文件 function sendArray() { return new Promise((resolve, reject) => { setTimeout(() => { resolve([1, 2, 3, 4]); }, 5000); }); } async function fetchArray() { const myArray = await sendArray(); return myArray; } module.exports = fetchArray;
导入使用示例:
const fetchArray = require('./data.js'); async function useArray() { const myArray = await fetchArray(); console.log(myArray); } useArray();
补充:如果用的是ES模块规范(.mjs后缀,或者package.json中设置type为module),Node.js 14.8以上版本支持顶层await,可以直接导出异步结果:
// ES模块导出写法 function sendArray() { return new Promise((resolve, reject) => { setTimeout(() => { resolve([1, 2, 3, 4]); }, 5000); }); } const myArray = await sendArray(); export default myArray;
导入时可以直接拿到最终值:
import myArray from './data.js'; console.log(myArray);
内容的提问来源于stack exchange,提问作者Hannan Khan
相关产品推荐
相关产品推荐

