通过ES6中通过promise处理回调函数问题
2018-01-22 00:00
447 查看
简要介绍:ES6中,可以通过promise来处理回调函数,回调函数经常用于异步操作中,间接来说,可以通过promise优化异步操作。
1.什么是JS中的回调函数?
回调函数是作为参数传递给另外一个函数,并且改回调函数在函数主题执行完后再执行。举例来说:
上述就是一个回调函数的例子,callback为回调函数,我们来看函数myFunction的执行过程,先执行函数的主题,最后再执行回调函数callback。
2.常见的回调函数以及存在的缺陷
(1)常见回调:
我们在jquery的ajax请求中,可以看到回调的身影,比如:
经典的封装后的ajax请求就是一个,success后面所跟的函数就是一个回调函数。
(2)存在问题
因为JS是异步的,通过回调函数异步操作,会造成回调函数的嵌套,很影响代码的可读性,下面来看回调函数嵌套的情况。
上述我们看到,当最外层请求成功之时,会调用第一个回调函数,而第一个回调函数里面又嵌套了第二个异步的回调函数,如此层层嵌套,代码的可读性大大的下降。
3.promise处理回调嵌套
(1)什么是promise
promise通常用于处理函数的异步调用,通过链式调用的方式,使得代码更加直观,举例来说:
我们可以看到设置promise只要new Promise()就可以,并且接受一个函数,该函数里面会执行resolve()方法,表示异步调用成功时执行,reject()表示异步调用失败时候调用。
在链式调用时候,then后面接的第一个函数为成功之时调用的函数——resolve,并且这里的默认参数等同于promise中resolve中的初始参数。
(2)then和catch
then:可以在promise中实现链式调用,在上文中已经介绍。补充,then里面的第二个函数,为异步调用失败之时执行,接上面的例子:
catch:catch方法,相当于then(null,function(err){console.log(err)}失败方法调用的一个缩写。
(3)Promise.all
Promise.all 可以接收一个元素为 Promise 对象的数组作为参数,当这个数组里面所有的 Promise 对象都变为 resolve 时,该方法才会返回。
4.总结
Promise在定义的时候,在new的时候就会执行一次,因此如果要构造ajax请求可以在new Promise里传递的这个函数内进行,在定义这个构造Promise的函数里面,可以判断什么时候是执行resolve,什么时候执行reject。
1.什么是JS中的回调函数?
回调函数是作为参数传递给另外一个函数,并且改回调函数在函数主题执行完后再执行。举例来说:
function callback(m,n){ alert("我是回调函数,我在执行"); return m+n }
function myFunction(callback){ var m=1; var n=2; return callback(1,2); }
上述就是一个回调函数的例子,callback为回调函数,我们来看函数myFunction的执行过程,先执行函数的主题,最后再执行回调函数callback。
2.常见的回调函数以及存在的缺陷
(1)常见回调:
我们在jquery的ajax请求中,可以看到回调的身影,比如:
ajax({ url:'...', method:'get', success:function(json){ //这里就是一个回调 } })
经典的封装后的ajax请求就是一个,success后面所跟的函数就是一个回调函数。
(2)存在问题
因为JS是异步的,通过回调函数异步操作,会造成回调函数的嵌套,很影响代码的可读性,下面来看回调函数嵌套的情况。
ajax({ url:'...', method:'get', success:function(json){ //这里是一个回调 ajax(function(json){ //这是一个回调函数的嵌套 }); } })
上述我们看到,当最外层请求成功之时,会调用第一个回调函数,而第一个回调函数里面又嵌套了第二个异步的回调函数,如此层层嵌套,代码的可读性大大的下降。
3.promise处理回调嵌套
(1)什么是promise
promise通常用于处理函数的异步调用,通过链式调用的方式,使得代码更加直观,举例来说:
var myPromise=function(tag){ return new Promise(function(resolve,reject){ if(tag){ resolve('默认参数success'); }else{ reject('默认参数filed'); } }) }
myPromise(true).then(function(message){ console.log(message) }) //"输出默认参数success"
我们可以看到设置promise只要new Promise()就可以,并且接受一个函数,该函数里面会执行resolve()方法,表示异步调用成功时执行,reject()表示异步调用失败时候调用。
在链式调用时候,then后面接的第一个函数为成功之时调用的函数——resolve,并且这里的默认参数等同于promise中resolve中的初始参数。
(2)then和catch
then:可以在promise中实现链式调用,在上文中已经介绍。补充,then里面的第二个函数,为异步调用失败之时执行,接上面的例子:
myPromise(false).then(null,function(err){ console.log(err) }) //这样会输出"默认参数filed"
catch:catch方法,相当于then(null,function(err){console.log(err)}失败方法调用的一个缩写。
myPromise(false).catch(function(err){console.log(err)}) //这句话与上面等价,也会输出"默认参数filed"
(3)Promise.all
Promise.all 可以接收一个元素为 Promise 对象的数组作为参数,当这个数组里面所有的 Promise 对象都变为 resolve 时,该方法才会返回。
var p1 = new Promise(function (resolve) { setTimeout(function () { resolve("Hello"); }, 3000); }); var p2 = new Promise(function (resolve) { setTimeout(function () { resolve("World"); }, 1000); }); Promise.all([p1, p2]).then(function (result) { console.log(result); // ["Hello", "World"] });
4.总结
Promise在定义的时候,在new的时候就会执行一次,因此如果要构造ajax请求可以在new Promise里传递的这个函数内进行,在定义这个构造Promise的函数里面,可以判断什么时候是执行resolve,什么时候执行reject。
相关文章推荐
- JS中的回调函数,以及ES6中通过promise处理回调
- Scrapy框架中通过爬虫文件中的parse函数中的callback无法回调别的函数的问题
- React native 之ES6语法(promise,箭头函数)
- 关于windows的safari浏览器的parseInt()函数处理08和09异常问题
- 关于bootstrapValidator 表单校验remote出现两次重复提交才能验证通过问题处理
- BP+SGD+激活函数+代价函数+基本问题处理思路
- 如何将GTK+-2.0的信号、回调处理映射成类成员函数的调用
- 使用Promise链式调用解决多个异步回调的问题
- react 通过 classnames 处理 多个class 的问题
- 分享回调地狱的体现与利用es6 Promise对回调的改良和实现
- app微信支付宝支付后台的插件模式+回调通过spring广播处理后续业务(已亲测可用)
- JavaScript的回调函数内部this的指向问题以及四种绑定this指向的方法
- 通过回调函数 调用parent窗体 关闭子窗体 因为没有运行完需要的函数 回调关闭会出错 需要延时执行
- inet_addr函数处理IP地址需要注意的问题
- es6箭头函数中this的问题
- (10)逻辑判断的问题:点评赛车(通过枚举处理逻辑判断问题。)
- Java通过匿名类来实现回调函数实例总结
- Gdiplus::GdiplusBase::operator new 函数不接受3 个参数"问题的处理
- void pointer as unknown argument type 和C回调函数问题
- UVALive 3026 Period KMP 失配函数处理周期的问题