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);
[js]promise学习2
原文地址:https://www.cnblogs.com/iiiiiher/p/9792709.html