什么是Promise

Promise是异步编程的一种解决方案,它有三种状态,分别是pending-进行中resolved-已完成rejected-已失败

当Promise的状态又pending转变为resolved或rejected时,会执行相应的方法,并且状态一旦改变,就无法再次改变状态,这也是它名字promise-承诺的由来

直接上案例了,在案例中理解:

最简单的promise

new Promise(resolve =>{
setTimeout(()=>{
resolve('hello')
},2000);
}).then(value=>{
console.log(value + 'world');
})
 
分两次,顺序执行
console.log('start');
new Promise(resolve => {
setTimeout(() => {
resolve('hello');
}, 2000);
})
.then(value => {
console.log(value);
return new Promise(resolve => {
setTimeout(() => {
resolve('world');
}, 2000)
});
})
.then(value => {
console.log(value + ' world');
}); // 结果
// start
// hello (2s)
// worldworld (4s)
 
假如一个promise已经完成,再.then()会怎样
console.log('start');

let promise = new Promise(resolve=>{
setTimeout(()=>{
console.log('this promise fullfilled');
resolve('hello,world')
},2000);
}); setTimeout(()=>{
promise.then(value=>{
console.log(value);
})
},4000) // 结果
// start
// this promise fullfilled (2s)
// hello,world (4s) //在任何地方生成一个promise后,可以存为一个变量,不管该promise有完成,都会依次根据队列执行
假如在 .then() 的函数里面不返回新的 Promise, 会怎样?
console.log('start');
new Promise(resolve => {
setTimeout(() => {
resolve('hello')
}, 2000);
})
.then(value => {
console.log(value);
(function () {
return new Promise(resolve => {
setTimeout(() => {
console.log('第二个promise');
resolve('Merry')
}, 2000);
})
}());
return false;
})
.then(value => {
console.log(value + 'world');
}) // 结果
// start
// hello (2s)
// falseworld (2s)
// 第二个promise (4s) //.then() 的函数里面不返回新的 Promise,会默认执行下一个环节,即使你直接返回了false,也会执行 // 备注
// 匿名函数,(function(){})();立即执行,主要利用函数内的变量作用域,避免产生全局变量,影响整体页面环境,增加代码的兼容性。
.then()接受两个函数作为参数,分别代表fulfilled和rejected
.then()返回一个新的promise实例,所以它可以链式调用
状态相应函数可以返回新的promise或其他值,如果返回新的Promise,那么下一级.then()会在新的Promise状态改变后执行
!!如果返回其他任何值,则会立即执行下一级.then()
.then()里面有.then()的情况
会等里面的.then()执行完,再执行外面的。最好不要这样写,依次展开效果一样
new Promise(resolve => {
console.log('start');
setTimeout(() => {
console.log('1');
resolve('1');
}, 1000)
})
.then(value => {
return new Promise(resolve => {
setTimeout(() => {
console.log('1-1');
resolve('1-1');
}, 1000)
})
.then(value => {
console.log('1-2');
return value;
})
.then(value => {
console.log('1-3');
return value;
})
})
.then(value => {
console.log('2');
}) /*
结果:
start
1
1-1
1-2
1-3
2
*/
错误处理两种做法:
Promise会自动捕获内部异常,并交给rejected响应函数处理
1.reject('错误信息').then(null,message=>{})
2.throw new Error('错误信息').catch(message=>{})
推荐时候用第二种,更加清晰,并且可以捕获前面的错误
console.log('go');
new Promise((resolve,reject)=>{
setTimeout(()=>{
reject('bye')
// throw new Error('bye');
},1000)
})
.then(value=>{
console.log(value+'world');
})
.catch(error=>{
console.log('error:',error);
}) // go
// error: bye
.catch() + .then()连用
 .catch()也会返回一个promise实例
 建议在所有队列后面都加上.catch()
console.log('go');
new Promise(resolve=>{
setTimeout(() => {
resolve('');
}, 1000);
})
.then(()=>{
console.log('start')
throw new Error('test error');
})
.catch((err)=>{
console.log('I catch:'+ err); // 下面一行代码的注释讲引发不同的走向
throw new Error('another error');
})
.then(()=>{
console.log('arrive here');
})
.then(()=>{
console.log('and here');
})
.catch((err)=>{
console.log('I catch:'+ err);
}) /*
结果一:
go
start
I catch:Error: test error
arrive here
and here
结果二:
go
start
I catch:Error: test error
I catch:Error: another error */
Promise.all([p1,p2,p3,...]); 批量同时执行多个promise实例,包装成一个新的promise实例,返回的是所有promise结果组成的数组
console.log('go');
Promise.all([1,2,3])
.then(all=>{
console.log('1:',all);
return Promise.all([function(){
console.log('ooxx');
},'xxoo',false])
})
.then(all =>{
console.log('2:',all);
let p1 = new Promise(resolve=>{
setTimeout(() => {
resolve('I`m P1');
}, 1000);
});
let p2 = new Promise(resolve=>{
setTimeout(() => {
resolve('I`m P2');
}, 3000);
});
return Promise.all([p1,p2]);
})
.then(all =>{
console.log('3:',all);
let p1 = new Promise(resolve=>{
setTimeout(() => {
resolve('I`m P1');
}, 1000);
});
let p2 = new Promise((resolve,reject)=>{
setTimeout(() => {
reject('I`m P2');
}, 1000);
});
let p3 = new Promise((resolve,reject)=>{
setTimeout(() => {
reject('I`m P3');
}, 1500);
});
return Promise.all([p1,p2,p3]);
})
.then(all=>{
console.log('all:',all);
})
.catch(err=>{
console.log('catch',err); }) /*
结果:
go
1: [ 1, 2, 3 ]
2: [ [Function], 'xxoo', false ]
3: [ 'I`m P1', 'I`m P2' ]
catch I`m P2
*/

promise学习总结的更多相关文章

  1. Javascript - Promise学习笔记

    最近工作轻松了点,想起了以前总是看到的一个单词promise,于是耐心下来学习了一下.   一:Promise是什么?为什么会有这个东西? 首先说明,Promise是为了解决javascript异步编 ...

  2. Promise 学习笔记 - 时间支配者

    本文同步自我的个人博客:http://www.52cik.com/2015/11/08/promise.html JavaScript 的 promises 事实标准称为 Promises/A+.ES ...

  3. Javascript Promise 学习 (中)

    时隔多日,对promise有了多一点点的了解. 最近用angularjs 做开发,所以研究了一下它的 $q 功能不算很强大,算是简化版的 Q.js 参考了一下源码,不过我的等级还差很多... 作为学习 ...

  4. Javascript Promise 学习(上)

    Promise 就是处理异步的一个规范方法 a();b();alert("a");如果a() 里面有一个ajax 或者settimeout 那么alert("a" ...

  5. JavaScript之Promise学习笔记

    一直想知道Promise到底是怎么实现的,网上一搜几十篇文章,看的一脸蒙蔽.最后算是找到几个讲的真心很详细明了的.看了一份源码看了很久很久……最后找大佬问了几处看不懂的地方,大佬只看了十几分钟就看懂了 ...

  6. Promise学习探究

    学习熟知吧,原理还是继续吧 例子1: var isGeted; function getRet(){ return new Promise(function(resolve, reject) { // ...

  7. Promise 学习心得

    当了这么久码农到今天没事才开始去深究 Promise 这个对象 什么是 Promise, Promise 有什么用? 在写代码的时候多多少少都有遇见过地狱式的回调 代码看起来没问题就是有点乱,Prom ...

  8. js的Promise学习笔记(1)

    1: 何为Promise Promise是抽象异步处理对象以及对其对象进行各种操作的组件,是基于并列/并行处理设计的一种编程语言. 说到基于JavaScript的异步处理,大多数都会想到利用回调函数. ...

  9. Promise学习

    转自:http://www.cnblogs.com/lvdabao/p/es6-promise-1.html 去年6月份, ES2015正式发布(也就是ES6,ES6是它的乳名),其中Promise被 ...

  10. Promise 学习笔记

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

随机推荐

  1. pycharm中代码整体缩进

    整体缩进 :  1.选中需要缩进的代码 2.Tab键 反向缩进:  shift+Tab

  2. nginx rewrite 指令

    ginx通过ngx_http_rewrite_module模块支持url重写.支持if条件判断,但不支持else. 该模块需要PCRE支持,应在编译nginx时指定PCRE源码目录, nginx安装方 ...

  3. [Android] 转-RxJava+MVP+Retrofit+Dagger2+Okhttp大杂烩

    原文url: http://blog.iliyun.net/2016/11/20/%E6%A1%86%E6%9E%B6%E5%B0%81%E8%A3%85/ 这几年来android的网络请求技术层出不 ...

  4. [openjudge-贪心]删数问题

    题目描述 题目描述 键盘输入一个高精度的正整数N,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小. 输出应包括所去掉的数 ...

  5. 微信小程序 地图地址解析

    1.微信小程序提供了几个方式,引入地图, wx.getLocation(OBJECT) 获取当前的地理位置.速度.当用户离开小程序后,此接口无法调用:当用户点击“显示在聊天顶部”时,此接口可继续调用 ...

  6. CSS中一个冒号和两个冒号有什么区别

    一个冒号是伪类,两个冒号是伪元素 伪类可以独立于文档的元素来分配样式,且可以分配给任何元素,逻辑上和功能上类类似,但是其是预定义的.不存在于文档树中且表达方式也不同,所以叫伪类.伪元素所控制的内容和一 ...

  7. C#简单的九九乘法表

    for(int i=1;i<10;i++) { for(int j=1;j<=i;j++) { Console.Write("{0}*{1}={2}",j,i,i*j) ...

  8. daily start

    2019/4/26 1. to summerize the merge experience, about makefile, about compile error analysis. 2. loo ...

  9. Docker Kubernetes 查询字段说明

    Docker Kubernetes  查询字段说明 # 打印受支持的API版本 kubectl api-versions # 扩展 apiextensions.k8s.io/v1beta1 # 注册 ...

  10. 剑指offer(21)栈的压入、弹出序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...