ES6--promise
来源:互联网 发布:飞鸽传书网络连接失败 编辑:程序博客网 时间:2024/05/18 00:02
1.问题的提出,请看下面代码
function asyncFun(a,b,cb){ setTimeout(function() { cb(a+b); },200);}asyncFun(1,2,function(result){ if(result>2){ console.log(result) }})
上面代码模拟了一个异步回调,很容容易看懂,但是如果回调里面继续有回调的时候呢,如下
function asyncFun(a,b,cb){ setTimeout(function() { cb(a+b); },200);}asyncFun(1,2,function(result){ if(result>2){ asyncFun(result,2,function(result){ if(result>4){ console.log("ok"); } }) }})上述代码继续进行回调,显然当层次比较多的时候,就不太符合人类的阅读习惯了,因此引入了promise规范。
'use strict';function asyncFun(a, b) { return new Promise(function (resolve, reject){ if(typeof a!='number'|| typeof b!='number'){ reject(new Error('not number type')) } resolve(a+b) })}asyncFun(1, '2').then( function(result){ if(result>2){ return asyncFun(result,2) } }).then(function(result){ if(result>4){ console.log(result+'OK') } }).catch(function(err){ console.log(err) })
上述代码不断有效的避免了深层次回调的写法,并且对异常的情况进行了处理,其中异常的处理,也可以进行如下
'use strict';function asyncFun(a, b) { return new Promise(function (resolve, reject){ //setTimeout(function () { if(typeof a!='number'|| typeof b!='number'){ reject(new Error('not number type')) } resolve(a+b) })}asyncFun(1, '2').then( function(result){ if(result>2){ return asyncFun(result,2) } }, function(err){//1111 console.log('first err------'+err) }).then(function(result){ if(result>4){ console.log(result+'OK') } }).catch(function(err){//2222 console.log(err) })从上述代码可以看出当1111处出现了语句后,2222处就不会执行了
2.请看一下代码,加深一下印象。
'use strict';class User { constructor(name) { this.name = name; } send(cb) { let name = this.name; return new Promise(function (resolve, reject) { if (name == 'ggb') { resolve('sucess'); } else { reject('err'); } }) }}new User('ggb').send().then(function(sucess){ console.log(sucess); //执行该段代码},function(err){ console.log(err)})
进行改良,同时进行验证两个参数
'use strict';class User { constructor(name,password) { this.name = name; this.password = password; } validateName(cb) { let name = this.name; return new Promise(function (resolve, reject) { if (name == 'ggb') { resolve('sucess'); } else { reject('name err'); } }) } validatePassword(cb) { let password = this.password; return new Promise(function (resolve, reject) { if (password == 1111) { resolve('both sucess'); } else { reject('password err'); } }) }}const user=new User('ggb',1111);user.validateName().then(function(){ return user.validatePassword() //11111}).then(function(sucess){ console.log(sucess)}).catch(function(err){ console.log(err);})
上述11111处的代码,也可以改为
user.validateName().then(function(){ return 'validate name ok' //11111}).then(function(sucess){ console.log(sucess)})
其实11111处的代码,没有返回promice ,但是类似于
var promise = Promise.resolve('valide name ok');
Promise.resovle ==============> var promice = new Promise(function(resolve,reject){
resovle('valide name ok');
})
3.Promise.all用法
看代码就可以知道,可以保存各个执行的结果
'use strict';function asyncFun(a, b) { return new Promise(function (resolve, reject){ //setTimeout(function () { if(typeof a!='number'|| typeof b!='number'){ reject(new Error('not number type')) } setTimeout(function(){ resolve(a+b) },500) })}var promise= Promise.all([asyncFun(1, 2),asyncFun(3, 4)]);promise.then(function(result){ console.log(result)})同时,promise还有一个race方法,顾名思义,竞赛的意思,就是取先执行完毕那个异步的值
阅读全文
0 0
- ES6--Promise
- ES6 Promise
- ES6-Promise
- ES6 Promise
- ES6 Promise
- es6 promise
- Promise ES6
- ES6 Promise
- ES6--promise
- ES6: Promise
- ES6 Promise
- es6 Promise
- 【ES6】Promise
- ES6-Promise
- ES6 Promise
- es6 promise
- es6 promise对象
- ES6 Promise 对象
- linux驱动调试之修改系统时钟中断定位系统僵死问题
- Java中常见排序之选择排序
- error MS8008 指定的平台工具集未安装
- 软件生命周期和软件设计原则
- 算法设计与应用基础
- ES6--promise
- 我的学习之路_第六章_跌打器,泛型
- 离散题目3(判断是否为子集)
- linux驱动调试之自制工具—寄存器编辑器
- 算法设计与应用基础
- libcurl with zlib 动态库 在 VS 下的编译
- 使用文献管理软件Mendeley插入参考文献和引用
- USACO之milk3
- 37 WebGL多个模型组成一个复杂的模型