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. NetCore AutoMapper的封装

     需要引用AutoMapper的Nuget包  如果需要忽略某个字段就在字段上面打标签如下:  [IgnoreMap] public string IgnoreValue { get; set; } ...

  2. jira设置问题关闭之后不能继续编辑和添加备注

    设置工作流中的Closed步骤的工作流属性值,增加两个: jira.permission.comment.user:(空) jira.issue.editable:false Closed这个步骤之后 ...

  3. STM32F072从零配置工程-自定义时钟配置详解

    从自己的板子STM32F407入手,参考官方的SystemInit()函数: 核心在SetSysClock()这个函数,官方默认是采用HSE(设定为8MHz)作为PLL锁相环的输入输出168MHz的S ...

  4. MMM 状压dp学习记

    状压dp学习记 by scmmm 开始日期 2019/7/17 前言 状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问 ...

  5. 【NOIP2017】图书管理员-C++

    描述 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个 正整数. 每位借书的读者手中有一个需求码,这个需求码也是一个正整数.如果一本书的图 书编码恰好以读者的需求码结尾,那么这 ...

  6. ISTQB名词辨析

    测试规程说明(Test Procedure Specification) 规定了执行测试的一系列行为的文档,也称为测试脚本或测试剧本.

  7. mvc区分页面内请求判断是否是Html.action或Html.RenderAction请求

    ControllerContext.IsChildAction 来判断,如果用Html.Action或Html.RenderAction方法,这个属性返回true,否则返回false

  8. Linux 文件编程、时间编程基本函数

    文件编程 文件描述符 fd --->>>数字(文件的身份证,代表文件身份),通过 fd 可找到正在操作或需要打开的文件. 基本函数操作: 1)打开/创建文件 int open (co ...

  9. 小白之入口即化——十分钟看懂while循环,字符串格式化,运算符

    while循环 while循环-死循环 while空格+条件+冒号 缩进+循环体 3.打断死循环 break--终止当前循环 while True: print(123) print(234) bre ...

  10. 怎样在自己的网页中调用百度API

    https://blog.csdn.net/u010251278/article/details/52877370 以下内容转自上述网站,为了以后的学习方便,为此才特地将该网站内容转到自己的博客,多谢 ...