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的更多相关文章

  1. 【干货分享】Node.js 中文学习资料和教程导航

    这篇文章来自 Github 上的一位开发者收集整理的 Node.js 中文学习资料和教程导航.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念,它的目标是帮助程 ...

  2. Node.js 中文学习资料和教程导航

    这篇文章来自 Github 上的一位开发者收集整理的 Node.js 中文学习资料和教程导航.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念,它的目标是帮助程 ...

  3. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  4. js数组学习整理

    原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...

  5. js入门学习~ 运动应用小例

    要实现的效果如下: 鼠标移入各个小方块,实现对应的效果(变宽,变高,移入透明,移出恢复)~~ (且各运动相互之前不干扰)  主要是练习多个物体的运动框架~~ --------------------- ...

  6. JS入门学习,写一个时钟~

    <!-- 耽搁了几天,于是又继续回到JS的学习了~~ 各种头大,加油吧... --> <!doctype html><html><head> <t ...

  7. js再学习笔记

    #js再学习笔记 ##基本 1.js严格区分大小写   2.js末尾的分号可加,也可不加   3.六种数据类型(使用typeof来检验数据的类型) `typeof` - undefined: `var ...

  8. JS数组学习笔记

    原文:JS数组学习笔记 最近在备课数组,发现很多ES5的方法平时很少用到.细节比较多,自己做了大量例子和整理,希望对大家了解JavaScript中的Array有所帮助. 概念 数组是值的有序集合.每个 ...

  9. js 正则学习小记之匹配字符串

    原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...

随机推荐

  1. 题目1015:还是A+B(简单判断)

    题目链接:http://ac.jobdu.com/problem.php?pid=1015 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  2. C - Yogurt factory

    The cows have purchased a yogurt factory that makes world-famous Yucky Yogurt. Over the next N (1 &l ...

  3. sg函数的理解

    sg,是用来判断博弈问题的输赢的,当sg值为0的时候,就是输,不为0就是赢: 在这之前,我们规定一个对于集合的操作mex,表示最小的不属于该集合的非负整数. 举几个栗子:mex{0,1,2}=3,me ...

  4. Qt 4.8.6 PCL 1.8.0 VS 2010 联合编译常见错误

    在Qt和PCL联合编译的过程中,会出现各种各样的错误,解决这些错误的过程真是痛苦万分,所以总结一些常见错误方便自己也方便他人.比如我们要编译PCL1.8.0中的apps中的point_cloud_ed ...

  5. css学习_css书写规范

    css书写规 1.空格规范: div { color: red; } 2.选择器规范 3.属性 属性定义要另起一行 属性定义后必须以分号结尾 div { color: red; font-size: ...

  6. Elasticsearch全文检索实战小结

    一.项目概述 这是一个被我称之为“没有枪.没有炮,硬着头皮自己造”的项目.项目是和其它公司合作的三个核心模块开发. 使用ES的目的是: 1).采集数据.网站数据清洗后存入ES: 2).对外提供精确检索 ...

  7. win10环境下搭建zookeeper伪集群

    一.下载zookeeper https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/ 这里笔者下载的是zookeeper-3.3.6 二.配置zoo ...

  8. hdu6330 多校3 L 画一个cube

    http://acm.hdu.edu.cn/showproblem.php?pid=6330 技巧:循环变量要选1~A,然后把公式写下标里.会快很多 #define _CRT_SECURE_NO_WA ...

  9. javascript中call、apply、bind详解

    1.apply和call的区别在哪里 2.什么情况下用apply,什么情况下用call 3.apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和call的定 ...

  10. [hyperscan][pkg-config] hyperscan 从0到1路线图

    经过一系列的研究学习,知识储备之后,终于,可以开始研究hyperscan了. [knowledge][模式匹配] 字符匹配/模式匹配 正则表达式 自动机 [knowledge][perl][pcre] ...