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)回调函数

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

 1 //这是一个具体的异步操作,其中使用function 指定一个具体的异步操作
 2 var promise = new Promise(function () {
 3     //这个function 内部写的就是具体的异步操作
 4 })
 5 //每当new一个Promise实例的时候,就会立即执行这个异步操作中的代码
 6 //如果不想立即执行需要放在一个函数中调用才执行
 7 function getFile(fpath) {
 8     var promise = new Promise(function (resolve,reject) {
 9         fs.readFile(fpath,'utf-8',function (err,data) {
10             if(err) {
11                 //console.log(err.message)
12                 reject(err)
13                 return false
14             }
15             //console.log(data);
16             resolve(data)
17         })
18     });
19     return promise
20 }
21 var p = getFile(path).then(function (data) {
22     console.log(data)
23 },function (err) {
24     console.log(err.message)
25 })

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

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)
})

转载于:https://www.cnblogs.com/HMleilei/p/10323212.html

Promise对象的resolve回调函数和reject回调函数使用相关推荐

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

    举例: 同步异步可以说是对被请求方来说的,被请求者使用什么方式来告知处理结果 思考,思考.......,好了,有答案了,当场告诉你 -------- 同步 这个问题需要一点时间,你先做点别的,等我想好 ...

  2. promise对象-代替回调函解决异步操作

    问题: 服务器中有3个文件a.txt.b.txt.c.txt分别存储的数据为1.2.3,通过js中的异步ajax,分别获取这3个文件的内容并求和输出6. 问题答案方法一(回调函数方法):(对应下面的: ...

  3. 浅谈Promise对象在ReactNative中的使用

    下面开始: 写在前面 假设现在一个日常开发会遇到这样一个需求:多个接口异步请求,第二个接口依赖于第一个 接口执行完毕之后才能利用数据进行一系列操作.一般会这样写: A.fetchData({url: ...

  4. 谈谈 ES6 的 Promise 对象

    2019独角兽企业重金招聘Python工程师标准>>> 谈谈 ES6 的 Promise 对象 异步编程 promise es6 javascript 前言 开篇首先设想一个日常开发 ...

  5. [ES6] 细化ES6之 -- Promise对象

    Promise对象是什么 Promise对象是什么 ES6新增了Prormnise对象,该对象允许对延迟和异步操作流程进行控制.一个Promise对象就是一个代表了异步操作最终完成或者失败的对象. 开 ...

  6. ES6 Promise 对象

    前言 开篇首先设想一个日常开发常常会遇到的需求:在多个接口异步请求数据,然后利用这些数据来进行一系列的操作.一般会这样去写: $.ajax({url: '......',success: functi ...

  7. Promise对象基本API介绍

    目录 一.含义: 二.Promise对象的特点: 1.对象的状态不受外界影响. 2.一旦状态改变.就不会再变,任何时候都可以得到这个结果. 3.避免了层层嵌套的回调函数,解决回调地狱的问题. 三.基本 ...

  8. 浅析JaveScript中的Promise对象 暮雨清秋

    前言 本文旨在简单讲解一下javascript中的Promise对象的概念,特性与简单的使用方法.并在文末会附上一份符合PromiseA+规范的Promise对象的完整实现. 注:本文中的相关概念均基 ...

  9. 【JavaScript 教程】ES6 中的 Promise对象 详解

    [JavaScript 教程]ES6 中的 Promise对象 详解 1.Promise对象含义 promise是异步编程的一种解决方法. 所谓promise,简单说是一个容器,里面保存着某个未来才会 ...

最新文章

  1. feignclient多个配置_@FeignClient同一个name使用多个配置类的解决方案
  2. (0048)iOS开发之内存管理探究
  3. 10月第3周安全回顾 中小企业易受攻击 RealPlayer现漏洞
  4. Redis持久化:AOF和RDB
  5. Bitmap之位图采样和内存计算详解
  6. 18.HMM隐马尔可夫模型
  7. 华为海选开发者状元?还送14件豪礼?
  8. 怀念一下过去的人和事
  9. pl sql 连接mysql_PL/SQL 连接mysql步骤
  10. C语言的变量怎样重启后不变,求解释,怎么能让程序里的变量在关闭后依然保存呢?...
  11. Android 系统(230)---OTA 软件包工具
  12. 算法--帕斯卡三角(杨辉三角)JS写法
  13. android Service 的简单使用
  14. python车流量检测车流统计车辆计数yolov5 deepsort车流检测
  15. java模拟器配置_JAVA模拟器全功略!
  16. 微信测试公众号如何进行支付测试
  17. 【工具】NavicatSQLDBXMysql WorkBench
  18. “程序员”眼中的中秋节
  19. 人人开源 / renren-security/小记(二)
  20. 微信小程序实现加载进度条

热门文章

  1. 一个屌丝程序猿的人生(八十)
  2. Linux Centos 7 实现java控制打印机打印文件**
  3. DirectX函数归纳总结
  4. java 生成随机码 字符数字图片等
  5. keevi源地址_贴吧源为什么一直添加不了?顺便分享好用的源添加贴吧源,一直提...
  6. 海南大学信号与系统838报考高频问题整理(五)
  7. 移动硬盘读不出来,无法识别的6种修复方法
  8. 操作系统期末大题复习
  9. mysql性能问题小解 Converting HEAP to MyIsam create_myisa
  10. 微信第三方平台之授权流程(三)