1 是什么

先直接上图,打印一下Promise对象,观察下Promise是什么

console.dir(Promise)


可以知道,Promise是一个构造函数,有着reject、resolve函数。prototype有then、catch等方法,说明了只要是Promise对象都会有这两个方法。

Promise构造函数是传入一个函数

2 怎么用

var promise = new Promise((resolve, reject) => {setTimeout(function () {console.log('执行完成');resolve('随便什么数据');}, 2000);
});result:
执行完成

传入的函数有两个参数:resolve、reject,分别表示异步操作执行成功后的回调函数和异步操作失败后的回调函数。其实这里用“成功”和“失败”来描述并不准确,按照标准来讲,resolve是将Promise的状态置为fullfiled,reject是将Promise的状态置为rejected。不过在我们开始阶段可以先这么理解,后面再细究概念。

运行以上代码,发现promise并没有调用,只是new了一个Promise,对应的传入函数的代码就已经执行了。因此,我们通常都是把Promise包在一个函数中,在需要的时候才去运行这个函数,如:

function f() {var promise = new Promise((resolve, reject) => {setTimeout(function () {console.log('执行完成');resolve('随便什么数据');}, 2000);});return promise
}f()result:
执行完成

这时引出两个问题。为什么需要大费周章的包装这样的一个函数?resolve有什么用?

2.1 为什么需要引入

f().then(function(data){console.log(data);//后面可以用传过来的数据做些其他操作//......
});

在f()的返回上可以直接调用then方法,then接收一个参数,是函数,并且会拿到我们在f中调用resolve时传入的参数。运行这段代码,会在2秒后输出“执行完成”,紧接着输出“随便什么数据”。

这时,我们恍然大悟了,原来then调用的function相当于我们之前写的回调函数,相当于是这种形式:

function runAsync(callback){setTimeout(function(){console.log('执行完成');callback('随便什么数据');}, 2000);
}runAsync(function(data){console.log(data);
});

那使用Promise有什么好处呢?我们不妨考虑一个问题,如果callback函数也是一个异步操作,而且执行完后也需要有相应的回调函数,可能会变成 runAsync(function(data,function(data){}){.....})。看起来十分丑陋,假如使用Promise代码就不会这么丑陋了~

Promise的优势在于,可以在then方法中继续写Promise对象并返回,然后继续调用then来进行回调操作。

2.2 链式操作的用法

所以,从表面上看,Promise只是能够简化层层回调的写法,而实质上,Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用,它比传递callback函数要简单、灵活的多。所以使用Promise的正确场景是这样的:

runAsync1()
.then(function(data){console.log(data);return runAsync2();
})
.then(function(data){console.log(data);return runAsync3();
})
.then(function(data){console.log(data);
});function runAsync1(){var p = new Promise(function(resolve, reject){//做一些异步操作setTimeout(function(){console.log('异步任务1执行完成');resolve('随便什么数据1');}, 1000);});return p;
}
function runAsync2(){var p = new Promise(function(resolve, reject){//做一些异步操作setTimeout(function(){console.log('异步任务2执行完成');resolve('随便什么数据2');}, 2000);});return p;
}
function runAsync3(){var p = new Promise(function(resolve, reject){//做一些异步操作setTimeout(function(){console.log('异步任务3执行完成');resolve('随便什么数据3');}, 2000);});return p;
}result:
异步任务1执行完成
随便什么数据1
异步任务2执行完成
随便什么数据2
异步任务3执行完成
随便什么数据3

我们可以通过链式编程避免了包含多函数回调的情况,当然并不是都需要return Promise对象,你也可以返回其他数据类型,在后面的then中就能直接直接接收到数据了,比如:

runAsync1()
.then(function(data){console.log(data);return runAsync2();
})
.then(function(data){console.log(data);return '直接返回数据';  //这里直接返回数据
})
.then(function(data){console.log(data);
});result:
异步任务1执行完成
随便什么数据1
异步任务2执行完成
随便什么数据2
直接返回数据

2.3 reject用法

前面我们一直都是使用resolve函数,并没有使用reject函数。resolve函数是表示了“执行成功”的回调,reject函数表示“执行失败”的函数。

function runAsync1() {var p = new Promise(function (resolve, reject) {//做一些异步操作setTimeout(function () {console.log('异步任务1执行完成');// resolve('随便什么数据1');reject("error")}, 1000);});return p;
}runAsync1().then((data) => {console.log('resolve');console.log(data)
}, (error, data) => {console.log('rejected');console.log(error)
})result:
异步任务1执行完成
rejected
error

需要注意的是,只要执行reject或者resolve,后面的就不会执行了,如:

function runAsync1() {var p = new Promise(function (resolve, reject) {//做一些异步操作setTimeout(function () {console.log('异步任务1执行完成');resolve('随便什么数据1');reject("error")}, 1000);});return p;
}

因为resolve在reject的前面,所以只会执行resolve,不会执行reject。

3 总结

  • Promise是一个对象
  • 引入是为了消除多重回调函数
  • Promise还有很多方法没有介绍(catch、finally、success、fail)

参考文献

ECMAScript6入门
大白话讲解Promise(一)
ECMAScript6入门

署名

广州芦苇科技Java开发团队

芦苇科技-广州专业互联网软件服务公司

抓住每一处细节 ,创造每一个美好

关注我们的公众号,了解更多

想和我们一起奋斗吗?lagou搜索“ 芦苇科技 ”或者投放简历到 server@talkmoney.cn 加入我们吧

关注我们,你的评论和点赞对我们最大的支持

ES6-Promise对象相关推荐

  1. ES6——Promise 对象

    所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Promise 提供统一的 A ...

  2. ES6 Promise 对象

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

  3. ES6 Promise对象和then()的用法

    Promise 对象 概述 是异步编程的一种解决方案. 从语法上说,Promise 是一个对象,从它可以获取异步操作的消息. 状态 Promise 异步操作有三种状态:pending(进行中).ful ...

  4. ES6 Promise对象then方法链式调用

    说明请看注释 /*** then()方法会返回一个新Promise对象, * 所以then后面可以继续跟一个then方法进行链式调用, * 如果then方法的回调函数有返回数据,* 那么这个数据会作为 ...

  5. 【ES6】Promise对象详解

    [ES6]Promise对象详解 一.Promise对象的含义 二.Promise对象的用法 三.Promise对象的几个应用[重点] 1.时间延迟函数 2.图片异步加载 查看更多ES6教学文章: 参 ...

  6. ES6之路第十二篇:Promise对象

    Promise的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Prom ...

  7. 谈谈 ES6 的 Promise 对象

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

  8. ES6类的使用和定义.Json.Promise对象的使用

    ECMAScript 6-第三讲 本章目标: 掌握es6中class类的声明 掌握类的继承 Json的新的应用 Promise对象的方法 本章内容: Class类的声明: 所谓的java的面向对象和这 ...

  9. 第十八节:教你如何使用ES6的Promise对象

    Promise对象,ES6新增的一个全新特性,今天我们要好好学习一下它. Promise的设计初衷 首先,我们先一起了解一下,为什么要设计出这么一个玩意儿,用它是为了解决什么问题? 带着这个问题,我们 ...

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

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

最新文章

  1. Datagridview 去掉单元格焦点虚框 和设置单元格不能被选中
  2. Bing空间数据服务
  3. vim补全html标签,vim括号引号html标签自动补全
  4. [Hive]-函数篇
  5. xsl调用java方法传参_Java中的XSL转换:一种简单的方法
  6. JavaScript中用var和不用var的区别
  7. python正则匹配11个数字_Python正则表达式匹配字符串中的数字
  8. wxpython安装linux_Ubuntu中安装wxPython
  9. 参数默认值,剩余参数,拓展参数(default spread rest parameter)
  10. MSP430F149学习之路——比较器Comparaor_A
  11. 【从C到C++学习笔记】程序/结构化程序设计/面向对象的程序设计
  12. CSS控制显示超出部分,用省略号显示
  13. js基础-19-判断图片加载完成的方法
  14. Chrome浏览器嗅探功能技巧
  15. 计算机组成原理白中英第四章,计算机组成原理 白中英第四章 指令系统.ppt
  16. 工业上服务器无线投屏到电视,台式电脑支持无线投屏吗 如何投屏到电视上
  17. Java8 effectively final
  18. wps的linux文字显示模糊,wps电脑打开文字模糊怎么办
  19. 2022-2028年全球与中国智能咖啡机行业市场前瞻与投资战略规划分析
  20. 【百度网盘】 个人资源共享

热门文章

  1. python数据分析常用包_python可视化数据分析常用图大集合(收藏)
  2. html浏览器影响js问题,js 浏览器兼容性问题
  3. 获取鼠标在盒子中的坐标
  4. 【 Notes 】NLS ALGORITHMS of TOA - Based Positioning
  5. 【 MATLAB 】【 MATLAB 】DFT的性质讨论(三)序列的循环卷积及其 MATLAB 实现
  6. 【 Linux 】Linux下如何退出vim的一些常用命令总结
  7. PicoBlaze输入/输出端口
  8. promise async 学习笔记
  9. android 发送http请求
  10. 深入研究Clang(九) Clang代码阅读之打log读流程2