Promise是ES6中用来结局回调地狱的问题的但是并不能帮我们减少代码量

  1. Promise是一个构造函数 new Promise() 得到一个Promise一个实例

  2. 在Promise上有两个函数分别是resolve(成功之后的回调函数)和reject(失败之后的回调函数)

  3. 在Promise构造函数的prototype属性上,有一个.then()方法,也就是只要是Promise构造函数创建的实例,都可以访问到.then()方法

  4. 如果Promise表示一个异步操作,每当我们new一个Promise的实例,这个实例就表示一个具体的异步操作

  5. 既然Promise创建的实例是一个异步操作那么这个异步操作的结果只能有两种状态

    • 状态一:异步执行成功 需要在内部调用,成功的回调函数resolve 把结果返回给调用者

    • 状态二:异步执行失败了 需要在内部调用,成功的回调函数reject把结果返回给调用者

    • 由于Promise的实例是一个异步操作,所以拿到操作结果后,无法使用return把操作结果返回给调用者,这个时候只能使用回调函数的形式,来把成功或者失败的结果返回给调用者

  6. 我们可以在new出来的Promise实例上,调用.then()方法【预先】为这个Promise一部操作,指定成功(resolve)和失败(reject)回调函数

  实现原理:(以读取文件为例)

 //这是一个具体的异步操作,其中使用function 指定一个具体的异步操作
var promise = new Promise(function () {
//这个function 内部写的就是具体的异步操作
})
//每当new一个Promise实例的时候,就会立即执行这个异步操作中的代码
//如果不想立即执行需要放在一个函数中调用才执行
function getFile(fpath) {
var promise = new Promise(function (resolve,reject) {
fs.readFile(fpath,'utf-8',function (err,data) {
if(err) {
//console.log(err.message)
reject(err)
return false
}
//console.log(data);
resolve(data)
})
});
return promise
}
var p = getFile(path).then(function (data) {
console.log(data)
},function (err) {
console.log(err.message)
})

回调地狱的写法(了解即可)

getFile(path.join(__dirname,'./file/1.txt')).then((data)=>{
console.log(data);
getFile(path.join(__dirname,'./file/2.txt')).then((data)=>{
console.log(data);
getFile(path.join(__dirname,'./file/3.txt')).then((data)=>{
console.log(data);
})
})
})

注意:回调嵌套只会降低效率,并且如果需要读取的文件太多,不好排错,在没有将代码执行完毕之前你永远不知道这段代码是在干什么

正确的写法:

//在上一个.then中返回一个新的promise实例,可以继续用下一个.then来处理
getFile('路径1').then(function (data) {
console.log(1,data);
return getFile('路径2')
}).then(function (data) {
console.log(2,data);
return getFile('路径3')
}).then(function (data) {
console.log(3,data);
})

如果执行失败了不想影响后续的promise的正常执行此时我们需要单独为每一个promise通过.then指定一下失败的回调

getFile(path).then(function (data) {
console.log(data)
  return getFile(path)
},function (err) {
console.log(err.message)
  return getFile(path)
}).then(function (data) {
console.log(data)
  return getFile(path)
},function (err) {
console.log(err.message)
  return getFile(path)
})

不管是正确的回调函数还是失败的回调函数都需要将下一个回调函数所需要的对象return出去

如果前面的失败了,则后面的就没有继续执行下去的意义,此时我们想实现一旦报错则立即终止所有的promise的执行;

//在promise的最后使用catch
.catch(function (err) {
//catch如果前面有任何的promise执行失败,则立即终止所有promise的执行并马上进入catch去处理promise中抛出异常
console.log('这是自己的处理方式:'+err.message)
})

Promise对象的resolve回调函数和reject回调函数使用的更多相关文章

  1. promise对象里resolve和reject状态讲解及Promise.all()的使用

    首先来说下同步异步与阻塞非阻塞的概念,同步异步与阻塞非阻塞并没有关系.同步异步主要是事情做完以后,如何进行处理.或者说关注的是一种消息通信机制. 同步的情况下,是由处理消息者自己去等待消息是否被触发: ...

  2. angularJS中的Promise对象($q)的深入理解

    原文链接:a better way to learn AngularJS - promises AngularJS通过内置的$q服务提供Promise编程模式.通过将异步函数注册到promise对象, ...

  3. 谈谈 ES6 的 Promise 对象

    https://segmentfault.com/a/1190000002928371 前言 开篇首先设想一个日常开发常常会遇到的需求:在多个接口异步请求数据,然后利用这些数据来进行一系列的操作.一般 ...

  4. Angular通信$q服务和promise对象

    promise 约定(promise)是一个对象,表示在未来时间点会发生的某件事情,约定可以是三种状态之一:等待.完成或拒绝.约定将从等待状态开始,然后可以转换为完成或者拒绝状态,一旦约定完成或者被拒 ...

  5. 大白话理解promise对象

    Promise  代表了未来某个将要发生的事件(通常是一个异步操作)  Promise 是异步编程的解决方案,能够简化多层回调嵌套,代表了未来某个将要发生的事件.Promise是一个构造函数,本身有a ...

  6. 16. Promise对象

    目录 Promise对象 一.含义 1. Promise是什么 2. 实例讨论 二.Promise特性案例解析 1. Promise的立即执行性 2. promise的三种状态 3. Promise的 ...

  7. promise对象的回调函数resolve的参数为另一个promise对象

    /*如果调用resolve函数和reject函数时带有参数,那么它们的参数会被传递给回调函数. reject函数的参数通常是Error对象的实例,表示抛出的错误: resolve函数的参数除了正常的值 ...

  8. 前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象

    JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous). “同步模式”就是一个任务完成之后,后边跟着一个任务接着执行:程序的执行顺序和排列 ...

  9. 回调函数 和 promise对象,及封装API接口

    1.回调函数:https://blog.csdn.net/baidu_32262373/article/details/54969696 注意:回调函数不一定需要用到 return.如果浏览器支持Pr ...

随机推荐

  1. Java学习笔记之---API的应用

    Java学习笔记之---API的应用 (一)Object类 java.lang.Object 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个 ...

  2. Java学习笔记之---static

    Java学习笔记之---static static不能修饰类,局部变量 (一)静态成员的特征 static+属性  静态属性 无论实例化出来多少个对象,都会共用同一块静态空间,类对象共享 静态成员从第 ...

  3. bzoj1584 9.20考试 cleaning up 打扫卫生

    1584: [Usaco2009 Mar]Cleaning Up 打扫卫生 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 549  Solved: 38 ...

  4. 【AI】Android Pie中引入的AI功能

    前言 “无AI,不未来”,绝对不是一句豪情壮语,AI早已进入到了我们生活当中.去年Google发布的Android Pie系统在AI功能方面就做了重大革新,本文就对Google在新系统中引入的AI功能 ...

  5. Java文本类型输入与输出

    import java.io.*; import java.time.LocalDate; import java.util.Scanner; public class Test { public s ...

  6. ZIP:ZipFile

    ZipFile: /* 此类用于从 ZIP 文件读取条目 */ ZipFile(File file) :打开供阅读的 ZIP 文件,由指定的 File 对象给出. ZipFile(File file, ...

  7. 俩台服务器搭建redis集群5.0.4

    俩台服务器搭建redis集群 1.俩服务器分别新建目录:usr/local/redis-cluster 2.下载源码并解压编译(使用redis版本5.0.4) 3.tar xzf redis-5.0. ...

  8. 科密指纹考勤机B329采集

    昨天项目用到了科密指纹考勤机B329. 暂记录下碰到的问题,及其解决办法,以备查询. 1.下载科密的二次开发包SDK“10079” .地址:( http://pan.baidu.com/s/1i39m ...

  9. Apache Httpd 启用重定向 rewrite

    1.启用模块 由:#LoadModule rewrite_module modules/mod_rewrite.so 更改为:LoadModule rewrite_module modules/mod ...

  10. HashSet源码解读

    一:先看其实现了哪些接口和继承了哪些类 1.实现了Serializable接口,表明它支持序列化. 2.实现了Cloneable接口,表明它支持克隆,可以调用超类的clone()方法进行浅拷贝. 3. ...