猿问

Node.JS 如何获取异步处理的结果并 return到最外层?

如题,

我想读取一个json文件,把内容转成string后再用JSON.paras把它转化成一个JSON的对象。

我现在很迷惑……麻烦大家指导一下。


//func.js

//假设我先把readFile给Promise化

const readFile = require('util').promisify(require('fs').readFile);


//然后我想把读取文件转化成JSON的过程封装在一个函数里

function read2JSON(filename){

    let result;

    readFile(filename).then((data)=>{

        return JSON.parse(data.toString());

    }).catch((err)=>{

        console.log("******ERROR******:" + err);

        return;

    });

}


//最后把这个函数暴露出来

exports.read2JSON = read2JSON;

//测试一下

let result = require('./func').read2JSON('db/list.json');

console.log(result);

结果显示的是undefined...

那么究竟该如何把这个结果return到最外层使用呢?这到底是什么原理?


慕慕森
浏览 930回答 3
3回答

蓝山帝景

给你几种写法:callback形式://func.jsconst readFile = require('util').promisify(require('fs').readFile);function read2JSON(filename, callback){    let result;    readFile(filename).then((data)=>{        callback(null, JSON.parse(data.toString()));    }).catch((err)=>{        console.log("******ERROR******:" + err);        callback(err, null);    });}exports.read2JSON = read2JSON;//测试一下require('./func').read2JSON('db/list.json', (err, parseResult) {    console.log(parseResult);});Promise写法://func.jsconst readFile = require('util').promisify(require('fs').readFile);function read2JSON(filename, callback){    return readFile(filename).then((data)=>{      return JSON.parse(data.toString());    })}exports.read2JSON = read2JSON;require('./func').read2JSON('db/list.json').then(function(result){    console.log(result);});async/await 写法://func.jsconst readFile = require('util').promisify(require('fs').readFile);exports.read2JSON = async (filename, callback) => {        let data = await readFile(filename);    let result = JSON.parse(data.toString());    return result;}require('./func').read2JSON('db/list.json').then(result => {    console.log(result);});

富国沪深

使用async/await,异步执行结束后再返回

人到中年有点甜

简单讲js是单线程,一定会一部分代码阻塞另一部分代码的运行,但是像网络请求或者读写文件,动作的开始和结束是在js,中间耗时的过程是在其他线程,异步就是让中间这部分不去阻塞其他js代码
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答