什么是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. java框架之SpringCloud(2)-Rest微服务案例

    在上一章节已经对微服务与 SpringCloud 做了介绍,为方便后面学习,下面以 Dept 部门模块为例做一个微服务通用 Demo —— Consumer 消费者(Client) 通过 REST 调 ...

  2. 五、UI开发之核心基础——约束(深入)

    概述 本节我们将较为理论的讲述约束,更准确的说法叫做“AutoLayout”.对于后续章节要学习的内容,本篇文章并非必须,如果你也像我当年一样正在被老板踢屁股赶进度的话,但可掠过本篇. 本篇内容旨在锦 ...

  3. WAR包方式安装Jenkins

    WAR包方式安装Jenkins     系统环境: CentOS 7.5 1804 IP:192.168.1.3 关闭selinux.firewalld jenkins war包:下载地址 一.安装t ...

  4. Software Testing 1 —— 有关编程错误的经历

    最令我印象深刻的程序错误几乎都是那些细节,具体的记不清了,因为真的很细.他们不会报正常的错,要么是时而可以正常运行,时而不能正常运行但是没有报错,比如闪退或者持续运行没有输出:要么是报的错误意义很宽泛 ...

  5. 线段树 HDU-1166 敌兵布阵

    敌兵布阵是一个线段树典题,题目如下(点此查看题目出处): Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国 ...

  6. Spring Boot 全局异常捕获

    import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.Control ...

  7. RFM用户分层模型简介

    RFM用户分层模型在实际商业活动的数据分析中运用的还是挺多的,主要用于用户.商品.门店等等的分群和细分层次,分群之后就可以进行定向精准营销和推广以及促活和留存等等的运营活动. RFM是一种用户分层模型 ...

  8. DUBBO分布式入门

    Dubbox框架简介: Dubbox是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo,被国内电商及互联网项目广泛使用,但是后阿里巴巴对该项目停止维护了,当当网后来组建了一个团队一直维护Dubb ...

  9. Qt做发布版,解决声音和图片、中文字体乱码问题(需要在main里写上QApplication::addLibraryPath("./plugins")才能加载图片,有图片,很清楚)

    前些天做Qt发布版,发现居然不显示图片,后来才发现原来还有图片的库没加!找找吧,去qt的安装包,我装在了F盘,在F盘F:/QT/qt/plugins,找到了plugins,这里面有个 imagefor ...

  10. 【题解】Luogu P2057 [SHOI2007]善意的投票

    原题传送门 我们一眼就能看出这是一道最小割的题 我们设不睡觉这种状态为S,睡觉这种状态为T 对于每个人,如果不想睡觉,就从S向这个人连流量为1的边,否则,就从这个人向T连流量为1的边 对于每一对朋友, ...