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. c++学习书籍推荐《The C++ Programming Language第四版》下载

    百度云及其他网盘下载地址:点我 作者简介 Bjarne Stroustrup is the designer and original implementer of C++, the author o ...

  2. 2017《java技术预备作业》

    2017<java技术预备作业> 1.阅读邹欣老师的博客,谈谈你期望的师生关系是什么样的? 亦师亦友,很多人这样说,确实,倘若师生之间如果中间有些隔阂最终吃亏的始终是学生.我认为师生之间应 ...

  3. Apache struts2 Freemarker标签远程命令执行_CVE-2017-12611(S2-053)漏洞复现

    Apache struts2 Freemarker标签远程命令执行_CVE-2017-12611(S2-053)漏洞复现 一.漏洞描述 Struts2在使用Freemarker模块引擎的时候,同时允许 ...

  4. Java编程思想:File类list()方法

    import java.util.regex.Pattern; import java.io.File; import java.io.FilenameFilter; public class Tes ...

  5. 【基本数据结构之堆】-C++

    注意:这篇博客讲的是手写堆,喜欢用C++自带数据结构模拟的慎入 今天我们来聊一聊一种奇怪 的数据结构: 堆 为什么说这个数据结构有点奇怪呢? 先看看其他的在我眼里是正常的数据结构: 队列(近似于排队) ...

  6. C#控制台打开VM虚拟机

    添加引用->VixCOM.dll (在vix文件夹下) VixWrapper.cs using System; using System.Collections.Generic; using S ...

  7. TP框架基础 (二) ---空控制器和空操作

    通过之前的学习我们知道了index.php是一个入口文件,如果没有这个入口文件的话,我们需要自己创建! [视图模板文件创建] 视图模板文件存放发位置在: 里面没有模板文件 如果我们想要访问Login控 ...

  8. git rebase 理解

    摘录自:https://blog.csdn.net/wangnan9279/article/details/79287631

  9. apache httpd多后缀解析漏洞复现

    apache httpd多后缀解析漏洞复现 一.漏洞描述 Apache Httpd支持一个文件拥有多个后缀,不同的后缀执行不同的命令,也就是说当我们上传的文件中只要后缀名含有php,该文件就可以被解析 ...

  10. 手撸PHP数据库连接

    最近这个月过得确实有点狼狈....不停地复习,看书..终于到今天为止考完了2科了.能让我好好地写写博客了..前段时间的PHP课设我多学了点东西,在我们一般老师讲的php连接数据库方面做了一些优化.前段 ...