Promise个人笔记---【Promise的前世今生】
Promise第一版本
案例是使用Node.js内置的fs模块[就是文件系统模块,负责读写文件。]来模拟异步操作
const fs = require('fs');
function getFilePath(fpath) {
let p = new Promise(function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr)
})
});
return p
}
let p = getFilePath('./src/main.js');
p.then(
function (data) {
console.log('-----------------' +data + '---------------')
},
function (err) {
console.log(err.message)
})
Promise 第二版本
const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr)
})
}
)
}
getFilePath('./src/main.js')
.then(
function (data) {
console.log('-----------------' + data + '---------------')
},
function (err) {
console.log(err.message)
}
)
新的需求: 依次读取 1.txt --> 2.txt --> 3.txt
第一版
const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr)
})
}
)
}
getFilePath('./1.txt')
.then(function (data) {
console.log('-----------------' + data + '---------------')
getFilePath('./2.txt')
.then(function (data) {
console.log('-----------------' + data + '---------------')
getFilePath('./3.txt')
.then(function (data) {
console.log('-----------------' + data + '---------------')
})
})
})
第二版
const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err)
resolve(dataStr)
})
}
)
}
getFilePath('./1.txt')
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./2.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./3.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
})
新需求 捕获过程中的错误 不影响后面的Promise正常执行
const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err);
resolve(dataStr)
})
}
)
}
getFilePath('./没有这个文件.txt')
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./2.txt')
}, function (err) {
console.log(err.message)
return getFilePath('./2.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./3.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
})
新需求 后面的执行以来前面的结果,当前面失败立即终止,并捕获错误
const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err);
resolve(dataStr)
})
}
)
}
getFilePath('./1.txt')
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./2.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./22.txt')
})
.then(
function (data) {
console.log('-----------------' + data + '---------------')
return getFilePath('./3.txt')
})
.catch(function (err) {
console.log('【自己】捕获到的错误'+ err.message)
})
上面那样写不太优雅,来个终极版
const fs = require('fs');
function getFilePath(fpath) {
return new Promise(
function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) return reject(err);
resolve(dataStr)
})
}
)
}
Promise.all([getFilePath('./1.txt'), getFilePath('./不存在.txt'), getFilePath('./1.txt')])
.then(datas => {
console.log(datas);
})
.catch(err => {
console.log(err)
})
小结:
- Vue中的vue-resource(官方已经不推荐使用)和axios都是基于Promise的,完全继承了Promise的特性,看过文档后分分钟可以上手
- axios中的http请求实现不需要在自己写逻辑了 ,直接调用它的api就可以
Promise个人笔记---【Promise的前世今生】的更多相关文章
- es6学习笔记--promise对象
Promise对象是为了简化异步编程.解决回调地狱情况 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可 ...
- js的Promise学习笔记(1)
1: 何为Promise Promise是抽象异步处理对象以及对其对象进行各种操作的组件,是基于并列/并行处理设计的一种编程语言. 说到基于JavaScript的异步处理,大多数都会想到利用回调函数. ...
- Promise 学习笔记
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise是一个对象,从它可以获取异步操作的消息.Promise提供统一的API, ...
- JavaScript之Promise学习笔记
一直想知道Promise到底是怎么实现的,网上一搜几十篇文章,看的一脸蒙蔽.最后算是找到几个讲的真心很详细明了的.看了一份源码看了很久很久……最后找大佬问了几处看不懂的地方,大佬只看了十几分钟就看懂了 ...
- js-ES6学习笔记-Promise对象(2)
1.Promise实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上的.它的作用是为Promise实例添加状态改变时的回调函数. 2.Promise.pr ...
- 《深入理解ES6》笔记—— Promise与异步编程(11)
为什么要异步编程 我们在写前端代码时,经常会对dom做事件处理操作,比如点击.激活焦点.失去焦点等:再比如我们用ajax请求数据,使用回调函数获取返回值.这些都属于异步编程. 也许你已经大概知道Jav ...
- ES6-11学习笔记--Promise
Promise是ES6异步编程解决方案之一,简化以前ajax的嵌套地狱,增加代码可读性. 基本用法: resolve,成功 reject,失败 let p = new Promise((resol ...
- Promise原理讲解 && 实现一个Promise对象 (遵循Promise/A+规范)
1.什么是Promise? Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一 2.对于几种常见异步编程方案 回调函数 事件监听 发布/ ...
- 理解Promise.all,Promise.all与Promise.race的区别,如何让Promise.all在rejected失败后依然返回resolved成功结果
壹 ❀ 引 我在 es6入门4--promise详解 这篇文章中有详细介绍Promise对象的用法,文章主题更偏向于对于Promise概念的理解与各方法基本使用介绍:而世上一个比较有趣的问题就是,即 ...
- ES6---new Promise()讲解,Promise对象是用来干嘛的?
ES6---new Promise()讲解,Promise对象是用来干嘛的? :https://blog.csdn.net/Wbiokr/article/details/79490390
随机推荐
- C#使用var定义变量时的四个特点
使用var定义变量时有以下四个特点: 1. 必须在定义时初始化.也就是必须是var s = “abcd”形式: 2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了. 3. var要求是 ...
- (函数分治法)实现pow函数(x的y次方幂)
题目:实现pow函数. 题目分析:因为一个一个乘,循环太大,参考矩阵连乘问题:对于n=4的话,可以得出x的平方,然后平方与平方相乘.节省计算次数.对于偶数的幂,只要x的平方多次递归调用即可:对于奇数的 ...
- Linux 查看是64位还是32位
[root@VM_7_88_centos ~]# uname -a Linux VM_7_88_centos 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36: ...
- Unity本地持久化类Playerprefs使用详解
一.PlayerPrefs是什么? PlayerPrefs是Unity3d提供了一个用于数据本地持久化保存与读取的类.工作原理十分简单,就是以key-value的形式将数据保存在本地,然后在代码中可以 ...
- IIS将http强转为https(重定向和重写)
最近接到一个需求,客户希望无论是http还是https请求都可以访问,并且http能转换成https.研究了一圈发现iis的重定向和重写都可以实现http强转https,记录一下. 用到的东东: In ...
- iOS应用打包完后再在开发者网站添加应用测试ID能够加入测试吗
1.明确指出 不行: 1.打包测试包前一定要先添加测试设备的UDID 2.添加测试的设备UDID一定要先于打包测试包,否则设备无法参加测试 3.使用蒲公英分享测试包,查看可参加测试的设备UDID 2. ...
- 上课总结-模电chapter 2
1.无明显失真时电压放大倍数——输出与输入电压的变化量之比 .无明显失真时 电流放大倍数——输出与输入电流的变化量之比 3.最大输出幅度 ①无明显失真时最大输出电压(或最大输出电流) ②交流有效值(U ...
- [Swift]八大排序算法(二):快速排序
排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...
- Elasticsearch插件head的安装(有坑)
http://blog.csdn.net/u012332735/article/details/56283932 Elasticsearch出了5.2.1版本之后,就去试试它的新版本的使用,为了以后的 ...
- [POI2007]ZAP-Queries 数学
题目描述 Byteasar the Cryptographer works on breaking the code of BSA (Byteotian Security Agency). He ha ...