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 ...
随机推荐
- python爬虫--房产数据爬取并保存本地
import requestsimport csvfrom bs4 import BeautifulSoupheaders={'user-agent':'Mozilla/5.0 (Windows NT ...
- HttpClient详细使用示例(转)
https://blog.csdn.net/justry_deng/article/details/81042379
- 397. 整数替换 (Medium
问题描述 397. 整数替换 (Medium) 给定一个正整数 n ,你可以做如下操作: 如果 n 是偶数,则用 n / 2 替换 n. 如果 n 是奇数,则可以用 n + 1 或 n - 1 替换 ...
- Java方法之递归详解【重点】
递归详解 A方法调用B方法,我们很容易理解! 递归就是:A方法调用A方法!就是自己调用自己. 利用递归可以用简单的程序来解决一些复杂的问题.它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较 ...
- element-ui的自定义表头
自定义表头 需求:之前在做一个项目的时候,原型图要求表头文字需要额外解释就会在文字后面标注 1,2作为上标 html中提供了<sup></sup>和<sub>< ...
- Safari浏览器如何收藏网页?
Safari浏览器是MacOS所自带的一款功能强劲的浏览器,许多MacOS的用户在使用过Safari浏览器后就不会去下载其他浏览器了.对于很多Mac新手用户来说,如何使用Safari浏览器来收藏喜欢的 ...
- 使用kubeadm快速部署k8s高可用集群
二进制安装方法请移步到:二进制部署高可用kubernetes-1.22.7集群 一:环境初始化 系统规划 k8s-master01 192.168.113.100 k8s-master02 192 ...
- Cimage类处理图像像素(数据)的3种方式(转)
这里只讨论对图像像素的处理,cimage类的具体用法查相关资料#include <atlimage.h> //VS2010以后不用加这个 --------CImage m_Image ...
- OSI网络七层模型简明教程
如果你读过计算机专业,或者学习过网络通信,那你一定听说过 OSI 模型,它曾无数次让你头大.OSI 是 Open System Interconnection 的缩写,译为"开放式系统互联& ...
- Java-Java数据类型对应MySql数据类型
开发过程中常用的数据类型: Java Mysql 备注 整型 java.lang.Integer tinyint(m) 1个字节 范围(-128~127) java.lang.Integer ...