ES6中promise对象——告别回调的嵌套
来源:互联网 发布:bluestack mac 编辑:程序博客网 时间:2024/06/05 06:28
什么是Promise?
在说Promise之前,不得不说一下JavaScript的嵌套的回调函数
在JavaScript语言中,无论是写浏览器端的各种事件处理回调、ajax回调,还是写Node.js上的业务逻辑,不得不面对的问题就是各种回调函数。回调函数少了还好,一旦多了起来而且必须讲究执行顺序的话,回调函数开始嵌套,那代码的恶心程度是相当不符合常人的线性思维的。
说到这里,我真有点想去了解一下响马老师的fibjs,我没有接触过它,但它的编程方式就是线性的,更加符合常人思维。我个人认为Promise就是为了把JS复杂的嵌套转换成常人思维的线性代码。
// 就像下面这样:// 你不在乎下面这三个ajax的执行顺序还好// 如果你在乎顺序呢?$.get('url', function(){ }, 'json');$.get('url1', function(){ }, 'json');$.get('url2', function(){ }, 'json');// 就像这样?$.get('url', function(){ $.get('url1', function(){ $.get('url2', function(){ }, 'json'); }, 'json');}, 'json');// 下面是我最近写的一段Node.js的代码// 其实这个嵌套也不算多// 如果业务逻辑相当复杂起来呢?// 嵌套20 30层?var adminIndex = function(params, callback){ storeAdmin.getApiTokens(function(err, tokens){ if ( err ) { callback(err); return; } storeAdmin.getApiServices(function(err, apiServices){ if ( err ) { callback(err); return; } storeAdmin.getSocketioServices(function(err, socketioServices){ if ( err ) { callback(err); return; } callback(0, { status : true, data : { api_tokens : tokens, api_services : apiServices, socketio_services : socketioServices } }); }); }); });};
说了这么多,到底什么是Promise呢?
其实,Promise就是一个类,而且这个类已经成为了ES6的标准,这个类目前在chrome32、Opera19、Firefox29以上的版本都已经支持了,要想在所有浏览器上都用上的话就看看es6-promise吧。
那Promise怎么用呢?
看一段很简单的代码,请注意阅读代码中的注释。
var val = 1;// 我们假设step1, step2, step3都是ajax调用后端或者是// 在Node.js上查询数据库的异步操作// 每个步骤都有对应的失败和成功处理回调// 需求是这样,step1、step2、step3必须按顺序执行function step1(resolve, reject) { console.log('步骤一:执行'); if (val >= 1) { resolve('Hello I am No.1'); } else if (val === 0) { reject(val); }}function step2(resolve, reject) { console.log('步骤二:执行'); if (val === 1) { resolve('Hello I am No.2'); } else if (val === 0) { reject(val); }}function step3(resolve, reject) { console.log('步骤三:执行'); if (val === 1) { resolve('Hello I am No.3'); } else if (val === 0) { reject(val); }}new Promise(step1).then(function(val){ console.info(val); return new Promise(step2);}).then(function(val){ console.info(val); return new Promise(step3);}).then(function(val){ console.info(val); return val;}).then(function(val){ console.info(val); return val;});// 执行之后将会打印步骤一:执行Hello I am No.1步骤二:执行Hello I am No.2步骤三:执行Hello I am No.3Hello I am No.3
Promise到底解决什么问题?
正如上面代码所示,笔者认为,Promise的意义就在于 then 链式调用 ,它避免了异步函数之间的层层嵌套,将原来异步函数的嵌套关系 转变为便于阅读和理解的 链式步骤关系 。
Promise的主要用法就是将各个异步操作封装成好多Promise,而一个Promise只处理一个异步逻辑。最后将各个Promise用链式调用写法串联,在这样处理下,如果异步逻辑之间前后关系很重的话,你也不需要层层嵌套,只需要把每个异步逻辑封装成Promise链式调用就可以了。
Promise常用的关键点
在Promise定义时,函数已经执行了
Promise构造函数只接受一个参数,即带有异步逻辑的函数。这个函数在 new Promise
时已经执行了。只不过在没有调用 then
之前不会 resolve 或 reject。
在then中的resolve方法中如何return?
在then方法中通常传递两个参数,一个 resolve
函数,一个 reject
函数。reject
暂时不讨论,就是出错的时候运行的函数罢了。resolve
函数必须返回一个值才能把链式调用进行下去,而且这个值返回什么是有很大讲究的。
resolve
返回一个新 Promise
返回一个新Promise之后再调用的then就是新Promise中的逻辑了。
resolve
返回一个值
返回一个值会传递到下一个then的resolve方法参数中。
阮一峰的ES6 教程
关于promises,你理解了多少?
- ES6中promise对象——告别回调的嵌套
- 谈谈 ES6 的 Promise 对象
- 谈谈 ES6 的 Promise 对象
- 谈谈 ES6 的 Promise 对象
- 谈谈 ES6 的 Promise 对象
- 谈谈 ES6 的 Promise 对象
- 谈谈 ES6 的 Promise 对象
- es6的Promise对象详解
- ES6——Promise
- ES6 —(Promise)
- ES6中Promise 的含义
- node与ES6系列2——promise对象
- es6 javascript的Promise对象(上)
- es6 javascript的Promise对象(下)
- ES6 Promise对象的学习笔记
- IE不支持 ES6 Promise 对象的解决方案
- es6 promise对象
- ES6 Promise 对象
- 继承
- SQL的基于Qt的编程实践---3--表查询插入
- 商品信息的简单增删改查
- 如何截取UIImage指定大小区域
- 树莓派wiringPI无root权限调用GPIO口
- ES6中promise对象——告别回调的嵌套
- 淘宝HSF服务的原理以及简单的实现
- Servlet —— Request对象 和 Response对象
- 关于引用第三方jar包,生成自己jar包运行时找不到第三方jar包的解决方案
- 大数阶乘
- VMware的ubantu系统使用gparted扩容
- 树莓派wiringPi输出PMW
- JavaScript中null和undefined
- 将博客搬至CSDN