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. dockerfile 制作镜像

    # Set the base image to UbuntuFROM ubuntu # File Author chenghanMAINTAINER chenghan ################ ...

  2. PipelineDB Install and Test

    Installation Prerequisites: CentOS Linux release 7.2.1511 (Core) Download [root@citus1 ~]# wget http ...

  3. Excel催化剂开源第40波-Excel插入图片做到极致的效果

    不知道是开发人员的自我要求不高还是用户的使用宽容度足够大,在众多Excel插入图片的版本中,都没有考虑到许多的可大幅度提升用户体验的细节处理. Excel催化剂虽然开发水平有限,但也在有限的能力下,尽 ...

  4. 从0系统学Android-2.3使用 Intent 在 Activity 之间穿梭

    2.3 使用 Intent 在 Activity 之间穿梭 在上一节中我们已经学会了如何创建一个 Activity 了.对于一个应用程序来说,肯定不可能只有一个 Activity.下面就来学习多个 A ...

  5. [系列] Gin框架 - 数据绑定和验证

    目录 概述 推荐阅读 概述 上篇文章分享了 Gin 框架使用 Logrus 进行日志记录,这篇文章分享 Gin 框架的数据绑定与验证. 有读者咨询我一个问题,如何让框架的运行日志不输出控制台? 解决方 ...

  6. an introduction of google breakPad for android

    一.背景 众所周知,Android JNI层的Crash问题是个比较头疼的问题.相对Java层来说,由于c/c++造成的crash没有输出如同 Java的Exception Strace,所以cras ...

  7. 如何在Eclipse中查看Java类库的源代码

    你的JDK安装目录下%Java_home%/src.zip文件就是源码,解压缩找到对应包下面的类即可. 如果是Eclipse开发,ctr+鼠标左击,出现不了源码的话,在弹出的视图中点击attach s ...

  8. 我造了个好大的"轮子",居然还不是"圆"的!

      我造的这个"轮子"指的是集低代码开发与运维为一体的平台,为什么说它不是"圆"的,因为它有些与众不同,甚至可以说是有些另类.至于为什么造这个"轮子& ...

  9. myeclipse中更改默认jdk版本出错( Target is not a JDK root. System library was not found)

    原因是我的本地jdk版本是9.0,将jdk版本更改至8.0即可导入成功. jdk9.0导入myeclipse中去会有此类问题的发生,因此没有必要使用最新的jdk版本.

  10. LeetCode 解题目录

    0001. 两数之和(Java) 0003. 无重复字符的最长子串(Java) 0172. 阶乘后的零 (Java) 0287. 寻找重复数(Java)