let fs = require("fs"),
path = require('path');

普通读取文件方法

/*
fs.readFile(path.resolve('./data.json'), 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
console.log(111); //readFile是异步的,会先执行
*/
//将读文件方法封装成函数return(因为readFile是异步的,不能用return)
/*function readFile(fp) {
fs.readFile(fp, 'utf8', (err, data) => {
if (err) return err;
return data;
})
} console.log(111);
console.log(readFile(path.resolve('./data.json'))); //undefined*/

利用回调解决获取数据问题

/*function readFile(fp, callback) {
fs.readFile(fp, 'utf8', (err, data) => {
if (err) return callback(err);
callback(null, data)
})
} readFile(path.resolve('./data.json'), (err, data) => {
if (err) console.log(err.message);
console.log(data)
});
console.log(111);*/

分开写回调更明确点

/*function readFile2(fp, succCb, errCb) {
fs.readFile(fp, 'utf8', (err, data) => {
if (err) return errCb(err);
succCb(data)
});
} readFile2(path.resolve('./data1.json'), function succCb(data) {
console.log(data);
}, function errCb(err) {
console.log('处理错误');
}); readFile2(path.resolve('./data.json'), function succCb(data) {
console.log(data);
readFile2(path.resolve('./data2.json'), function succCb(data) {
console.log(data);
readFile2(path.resolve('./data3.json'), function succCb(data) {
console.log(data);
});
});
});*/

使用promise实现读文件

/*
var p = new Promise(function () {
fs.readFile(path.resolve('./data.json'), 'utf8', (err, data) => {
if (err) return err;
console.log(data);
})
}); //特点, new后立即执行excutor
*/

如何不让立即执行: 放到函数里

/*function readFile() {
var p = new Promise(function () {
fs.readFile(path.resolve('./data.json'), 'utf8', (err, data) => {
if (err) throw err;
console.log(data); //如何获取数据: 异步操作不能return
})
});
} console.log(111);
readFile();
console.log(222);*/

使用promise的reject和resolve返回数据

/*
function readFile() {
var promise = new Promise(function (resolve, reject) {
fs.readFile(path.resolve('./data1.json'), 'utf8', (err, data) => {
if (err) return reject(err);
resolve(data); //如何获取数据: 异步操作不能return
})
});
return promise; //1,返回时var promise还并没有只系那个
} var p = readFile();
p.then(function (data) { //2,直到.then实例化了具体的resolve, reject函数后, 才去执行的var promise的内容.
console.log(data);
}, function (err) {
console.log(err); }); */
//优化
//1.取消return中间变量
//2.调用tehn时候不必中间变量
/*
function readFile() {
return new Promise(function (resolve, reject) {
fs.readFile(path.resolve('./data.json'), 'utf8', (err, data) => {
if (err) return reject(err);
resolve(data); //如何获取数据: 异步操作不能return
})
});
//1,返回时var promise还并没有只系那个
} readFile().then(function (data) { //2,直到.then实例化了具体的resolve, reject函数后, 才去执行的var promise的内容.
console.log(data);
}, function (err) {
console.log(err);
});
*/
function readFile(fp) {
return new Promise(function (resolve, reject) {
fs.readFile(path.resolve(fp), 'utf8', (err, data) => {
if (err) return reject(err);
resolve(data); //如何获取数据: 异步操作不能return
})
})
} /*
readFile('data.json').then(function (data) {
console.log(data);
readFile('data2.json').then(function (data) {
console.log(data);
readFile('data3.json').then(function (data) {
console.log(data);
});
});
});*/
/*
readFile('data.json').then(function (data) {
console.log(data);
11
return readFile('data2.json'); //返回新的promise, 本次返回的promise对象, 被第二个.then()操作
}).then(function (data) {
console.log(data);
return readFile('data3.json');
}).then(function (data) {
console.log(data);
}); console.log(111);*/

默认情况,前面的promise错误,即终止promise, 后面的then不会执行

情况1: 使用错误的回调解决这个问题: 前面执行失败了,不要印象后续promise正常运行.

/*
readFile('data11.json').then(function (data) {
console.log(data);
return readFile('data2.json'); //返回新的promise, 本次返回的promise对象, 被第二个.then()操作
}, function (err) {
console.log('失败1');
return readFile('data2.json'); //返回新的promise,避免影响下一个
}).then(function (data) {
console.log(data);
return readFile('data3.json');
}, function (err) {
console.log('失败2');
return readFile('data3.json');
}).then(function (data) {
console.log(data);
}, function (err) {
console.log('失败3');
}); console.log(111);
*/

情况2: 如果后面的promise依赖于前面的promise执行结果, 前面错了,后面就不必执行了

//一旦保存,立即终止所有promise执行

// cache的作用,如果前面的任何一个promise执行失败,则立即终止执行, 并进入cahce处理异常.
readFile('data.json').then(function (data) {
console.log(data);
11
return readFile('data22.json'); //返回新的promise, 本次返回的promise对象, 被第二个.then()操作
}).then(function (data) {
console.log(data);
return readFile('data3.json');
}).then(function (data) {
console.log(data);
}).catch(function (err) { //有1个错误,立即终止promise,2.进入cache处理
console.log('自己的输出', err);
}); console.log(111);

最新文章

  1. 浮动div中的图片垂直居中
  2. 触摸屏测试:Tslib
  3. Commons JXPath - DOM/JDOM Document Access
  4. js字符串长度计算(一个汉字==两个字符)和字符串截取
  5. Telnet,SSH1,SSH2,Telnet/SSL,Rlogin,Serial,TAPI,RAW
  6. JavaScript原型与继承
  7. vim 配置快捷以使复制可用
  8. LPC1768的usb使用--硬件篇
  9. 1017. Queueing at Bank (25) - priority_queuet
  10. Unix/Linux中的grep命令(转)
  11. [转]Red Hat Linux相关产品iso镜像下载【百度云】
  12. string与stringBuffer区别
  13. kalinux实现自适用全屏、与物理主机共享文件方法
  14. Linux基础命令---杀死进程pkill
  15. MyEclipse与Eclipse配置清单
  16. 20165309 技能学习经验与C语言
  17. jquery关于attr和prop的差异
  18. 你的产品适不适合做微信小程序?你需要这篇产品逻辑分析
  19. 【EasyUI学习-3】Easyui tabs入门实践
  20. RF相关知识

热门文章

  1. 正则表达式/(^\s*)|(\s*$)/g意思
  2. Diagnostics: File file:/tmp/spark-***/__spark_libs__***.zip does not exist
  3. 洛谷P1605 迷宫【dfs】
  4. LDAP - 轻量目录访问协议
  5. LeetCode 29 - 两数相除 - [位运算]
  6. MAC apache服务器搭建
  7. zabbix自动发现主机并加入组绑定模板
  8. SQL复制数据表 (select * into 与 insert into)
  9. Linux Semaphore
  10. Linux7安装Oracle 11g 86%报错:Error in invoking target 'agent nmhs' of makefile