promise一脸懵逼...
1 const fs=require('fs')
2 const path=require('path')
3
4 /*
5 fs.readFile(path.join(__dirname,'./files/1.txt'),'utf-8',(err,dataStr)=>{
6 if(err) throw err
7 console.log(dataStr)
8 })
9 */
命令行敲 :node .\01.封装读取文件的方法.js,结果为1.txt的内容 :111
2.调用function
1 function getFileByPath(fpath){
2 fs.readFile(fpath,'utf-8',(err,dataStr)=>{
3 if(err) throw err
4 console.log(dataStr) // 打印->111
5 })
6 }
7 // getFileByPath(path.join(__dirname,'./files/1.txt')) // 结果 ->111
8 // var result=getFileByPath(path.join(__dirname,'./files/1.txt'))
9 // console.log(result) // 结果 ->undefined
3.加入回调函数
1 function getFileByPath(fpath,callback){
2 fs.readFile(fpath,'utf-8',(err,dataStr)=>{ //异步
3 if(err) throw err
4
5 callback(dataStr)
6 })
7 }
8 getFileByPath(path.join(__dirname,'./files/1.txt'),(dataStr)=>{
9 console.log(dataStr+'-----')
10 //结果: 111-----
11 })
4.对回调函数进行修改
1 callback中有两个参数,一:失败的结果 二:成功的结果
2 规定:如果成功后,返回的结果,应该位于callback参数的第二个位置,
3 此时第一个参数没有出错,所以第一个放一个null
4 如果失败了,第一个位置放err对象,第二个位置放undefined
5
6 function getFileByPath(fpath,callback){
7 fs.readFile(fpath,'utf-8',(err,dataStr)=>{
8 if(err) callback(err)
9
10 callback(null,dataStr)
11 })
12 }
13 //读一个不存在的文件,验证err
14 getFileByPath(path.join(__dirname,'./files/11.txt'),(err,dataStr)=>{
15 //失败
16 if(err) return console.log(err.message)
17 //成功
18 console.log(dataStr)
19 })
5.提高版
1 function getFileByPath(fpath,succCb,errCb){
2 fs.readFile(fpath,'utf-8',(err,dataStr)=>{
3 if(err) return errCb(err)
4
5 succCb(dataStr)
6 })
7 }
8 getFileByPath(path.join(__dirname,'./files/1.txt'),function(data){
9 console.log(data+"成功了")
10 },function(err){
11 console.log("失败的结果,使用失败的回调处理"+err.message)
12 })
6.需求:先读取文件1,再读取文件2,再读取文件3
1 function getFileByPath(fpath,succCb,errCb){
2 fs.readFile(fpath,'utf-8',(err,dataStr)=>{
3 if(err) return errCb(err)
4
5 succCb(dataStr)
6 })
7 }
8
9 // 需求:先读取文件1,再2再3
10 getFileByPath(path.join(__dirname,'./files/1.txt'),function(data){
11 console.log(data)
12
13 getFileByPath(path.join(__dirname,'./files/2.txt'),function(data){
14 console.log(data)
15
16 getFileByPath(path.join(__dirname,'./files/3.txt'),function(data){
17 console.log(data)
18 })
19 })
20 })
1.Primise
1 // 1.Promise是一个构造函数
2 // 2,在Promise上,有两个函数:resolve(成功之后的回调函数)和reject(失败之后的回调函数)
3 // 3.在Promise 构造函数的 Prototype 属性上,有一个 .them()方法,,即只要是Promise构造函数创建的实例,都可以访问到 .then()方法
4 // 4.如果Promise表示一个异步操作,每次new一个promise实例时,此实例表示一个具体的异步操作
5 // 5.Promise创建的实例是异步操作,那么这个异步操作的结果,只能有两种状态:
6 // 5.1状态1:异步执行成功,在内部调用成功的回调函数 - resolve 把结果返回给调用者
7 // 5.2状态2:异步执行失败,在内部调用失败的回调函数 - reject 把结果返回给调用者
8 // 5.3由于promise的实例是异步操作,所有内部拿到操作的结果后,无法使用return 把操作的结果返回给调用者,
9 // 只能使用回调函数的形式,将成功或失败的结果返回给调用者
10
11 // 每当new一个Promise实例的时候,就会立即执行异步操作中的代码,
12 // 即,new的时候,除了能得到一个promise实例外,还会调用为promise构造函数传递的那个function,执行此function中的异步操作代码
1 const fs=require('fs')
2 /*var promise=new Promise(function(){
3 fs.readFile('./files/2.txt','utf-8',(err,dataStr)=>{
4 if(err) throw err
5 console.log(dataStr)
6 })
7 })
8 */
1 /*function getFileByPath(fpath){
2 var promise=new Promise(function(){
3 fs.readFile(fpath,'utf-8',(err,dataStr)=>{
4 if(err) throw err
5 console.log(dataStr)
6 })
7 })
8 }
9 getFileByPath('./files/2.txt')
10 */
1 function getFileByPath(fpath){
2 var promise=new Promise(function(resolve,reject){
3 fs.readFile(fpath,'utf-8',(err,dataStr)=>{
4 if(err) return reject(err)
5 resolve(dataStr)
6 })
7 })
8 return promise
9 }
10 var p=getFileByPath('./files/2.txt')
11 p.then(function(data){
12 console.log(data+'------')
13 },function(err){
14 console.log(err+'------')
15 })
改进:
1 function getFileByPath(fpath){
2 return new Promise(function(resolve,reject){
3 fs.readFile(fpath,'utf-8',(err,dataStr)=>{
4 if(err) return reject(err)
5 resolve(dataStr)
6 })
7 })
8 }
9 getFileByPath('./files/2.txt')
10 .then(function(data){
11 console.log(data+'------')
12 },function(err){
13 console.log(err+'------')
14 })
解决回调地狱:在上一个 .then 中,返回一个新的promise实例,可以继续使用下一个.then来处理
1 const fs=require('fs')
2
3 function getFileByPath(fpath){
4 return new Promise(function(resolve,reject){
5 fs.readFile(fpath,'utf-8',(err,dataStr)=>{
6 if(err) return reject(err)
7 resolve(dataStr)
8 })
9 })
10 }
11 // 先读取1,后2 再3
12 // 注意:通过.then指定 回调函数的时候,成功的回调函数,必须传,失败的回调,可以省略不传
13 getFileByPath('./files/1.txt')
14 .then(function(data){
15 console.log(data)
16
17 return getFileByPath('./files/2.txt')
18 })
19 .then(function(data){
20 console.log(data)
21
22 return getFileByPath('./files/3.txt')
23 })
24 .then(function(data){
25 console.log(data)
26 })
在.then中指定失败的操作:
1 // 如果前面的promise执行失败,不想让后续的Promise被终止,可以为每个promise指定失败的操作
2 getFileByPath('./files/11.txt')
3 .then(function(data){
4 console.log(data)
5
6 return getFileByPath('./files/2.txt')
7 },function(err){
8 console.log('1失败了,2继续'+err.message)
9 // 返回新的promise
10 return getFileByPath('./files/2.txt')
11 })
12 .then(function(data){
13 console.log(data)
14
15 return getFileByPath('./files/3.txt')
16 })
17 .then(function(data){
18 console.log(data)
19 })
20
21 console.log('为什么会执行我?')
22
23 PS D:\webstorm\01\promise> node .\04.使用promise解决回调地狱.js
24 为什么会执行我?
25 1失败了,2继续ENOENT: no such file or directory, open 'D:\webstorm\01\promise\files\11.txt'
26 222
27 333
有依赖关系时,异常捕获:
1 / 有时候,需求:与上面的需求刚好相反,如果后续的promise执行,依赖于前面promise执行的结果,
2 // 如果前面失败了,则后面的就没有继续执行下去的意义
3 getFileByPath('./files/1.txt')
4 .then(function(data){
5 console.log(data)
6
7 return getFileByPath('./files/21.txt')
8 })
9 .then(function(data){
10 console.log(data)
11
12 return getFileByPath('./files/3.txt')
13 })
14 .then(function(data){
15 console.log(data)
16 }).catch(function(err){ //如果前面有任何的promise执行失败,则立即终止所有的promise操作,进入catch中
17 console.log('自己处理的错误的捕获:'+err.message)
18 })
JQuery中ajax使用promise指定成功回调函数:
1 <input type="button" value="获取数据" id="btn">
2
3 <script src="./node_modules/jquery/dist/jquery.min.js"></script>
4
5 <script>
6 $(function(){
7 $('#btn').on('click',function(){
8 $.ajax({
9 url:'./data.json',
10 type:'get',
11 dataType:'json',
12 // success(data){
13 // console.log(data)
14 // }
15 })
16 .then(function(data){
17 console.log(data)
18 })
19 })
20 })
promise一脸懵逼...的更多相关文章
- 一脸懵逼学习Hadoop中的序列化机制——流量求和统计MapReduce的程序开发案例——流量求和统计排序
一:序列化概念 序列化(Serialization)是指把结构化对象转化为字节流.反序列化(Deserialization)是序列化的逆过程.即把字节流转回结构化对象.Java序列化(java.io. ...
- Python里面这些点,据说80%的新手都会一脸懵逼
Python里面这些点,据说80%的新手都会一脸懵逼 菜鸟Python 关注 2018.10.10 12:51 字数 1833 阅读 123评论 0喜欢 10 Python虽然语法简单,通俗易懂,但是 ...
- kuangbin带我飞QAQ DLX之一脸懵逼
1. hust 1017 DLX精确覆盖 模板题 勉强写了注释,但还是一脸懵逼,感觉插入方式明显有问题但又不知道哪里不对而且好像能得出正确结果真是奇了怪了 #include <iostream& ...
- 腾讯一面!说说ArrayList的遍历foreach与iterator时remove的区别,我一脸懵逼
本文基于JDK-8u261源码分析 1 简介 ArrayList作为最基础的集合类,其底层是使用一个动态数组来实现的,这里"动态"的意思是可以动态扩容(虽然ArrayList可 ...
- 一脸懵逼学习基于CentOs的Hadoop集群安装与配置
1:Hadoop分布式计算平台是由Apache软件基金会开发的一个开源分布式计算平台.以Hadoop分布式文件系统(HDFS)和MapReduce(Google MapReduce的开源实现)为核心的 ...
- 一脸懵逼学习Storm---(一个开源的分布式实时计算系统)
Storm的官方网址:http://storm.apache.org/index.html 1:什么是Storm? Storm是一个开源的分布式实时计算系统,可以简单.可靠的处理大量的数据流.被称作“ ...
- Java中线程同步锁和互斥锁有啥区别?看完你还是一脸懵逼?
首先不要钻概念牛角尖,这样没意义. 也许java语法层面包装成了sycnchronized或者明确的XXXLock,但是底层都是一样的.无非就是哪种写起来方便而已. 锁就是锁而已,避免多个线程对同一个 ...
- 一脸懵逼学习keepalived(对Nginx进行热备)
1:Keepalived的官方网址:http://www.keepalived.org/ 2:Keepalived:可以实现高可靠: 高可靠的概念: HA(High Available), 高可用性集 ...
- 一脸懵逼学习Nginx及其安装,Tomcat的安装
1:Nginx的相关概念知识: 1.1:反向代理: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到 ...
- 一脸懵逼学习Linux的Shell编程
1:什么是Shell??? (1)Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell(2)Shell也是一门编程语言<解释型的编程语言>,即she ...
随机推荐
- dnspy查看async方法
- (面试题)面试官为啥总是让我们手撕call、apply、bind?
引言 上一篇关于<面试官为啥总是喜欢问前端路由实现方式>的文章发布后,发现还是挺受欢迎的.这就给我造成了一定的困惑 之前花了很长时间,实现了一个自认为创意还不错的关于前端如何利用node+ ...
- 有关插槽中scope的问题
暂时不理解
- Node Sass version 7.0.1 is incompatible with ^4.0.0 node-sass 问题
执行旧版项目安装依赖时报错 卸载 npm uninstall node-sass sass-loader 安装(need Python27) npm install sass-loader@7.3.1 ...
- MYSQL实现排名函数RANK,DENSE_RANK和ROW_NUMBER
1. 排名分类 1.1 区别RANK,DENSE_RANK和ROW_NUMBER RANK并列跳跃排名,并列即相同的值,相同的值保留重复名次,遇到下一个不同值时,跳跃到总共的排名. DENSE_RAN ...
- hadoop克隆三台虚拟机安装JDK和hadoop并配置环境变量
首先将模板虚拟机关机,进行对模板虚拟机的克隆. 选择完整克隆 克隆三台虚拟机. 注意虚拟机的移除与删除 打开hadoop102,修改ip地址与hostname 切换至root用户,或以root用户登录 ...
- 064_Js常用的五大事件 onclick nochanger onload onsubmit onblur
事件是电脑输入设备与页面交互的响应. onload加载完成事件:onload事件 是在页面被浏览器加载完成之后.自动触发的响应 onclick单击事件 onblur失去焦点事件 onchange内容发 ...
- JS篇(006)-怎样添加、移除、移动、复制、创建和查找节点?
答案: 1)创建新节点 createDocumentFragment() //创建一个 DOM 片段 createElement() //创建一个具体的元素 createTextNode() //创建 ...
- ubuntu64运行32位程序安装过程
Ubuntu运行32位程序可以使用如下方法: 第一步: 确认你有一个64位架构的内核 你可以打开终端然后输入: dpkg --print-architecture 你将会看到像下面这样的内容: amd ...
- 4. python 文件操作
文件打开有3种方式:读模式.写模式.追加模式 f = open('words','r',encoding='utf-8') #打开文件 print(f.read()) #读文件,读取之后文件指针放到最 ...