promise
- 先了解异步和同步的区别
- Promise是什么
- promise的写法
- promise的all和race方法
同步和异步的区别
同步
所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉)。这种情况下,用户不能关闭界面,如果关闭了,即迁移程序就中断了。
异步
将用户请求放入消息队列,并反馈给用户,系统迁移程序已经启动,你可以关闭浏览器了。然后程序再慢慢地去写入数据库去。这就是异步。但是用户没有卡死的感觉,会告诉你,你的请求系统已经响应了。你可以关闭界面了。不用等所有操作都做完,就相应用户请求。
区别
同步,是所有的操作都做完,才返回给用户结果。即写完数据库之后,再响应用户,用户体验不好。
异步,不用等所有操作都做完,就相应用户请求。即先响应用户请求,然后慢慢去写数据库,用户体验较好。
promise是什么
Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。
(1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称Fulfilled)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
- 首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。
- 其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
- 第三,当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
为了方便,定义一个promise对象
const promise = new Promise(function (resolve, reject) {
var timeOut = Math.random() * 2;//定义一个随机数乘二
setTimeout(function () { //延迟执行
if (timeOut < 1) { //小于一执行成功回调
resolve('200 OK');
}
else { //大于一执行失败回调
reject('timeout in ' + timeOut + ' seconds.');
}
}, timeOut * 1000);
})
promise 的写法
promise
.then(function (r) {
log('ok: ' + r);
}).catch(function (reason) {
log('Failed: ' + reason);
});
promise
.then(
function (r) { //参数一
log('ok: ' + r);
},
function (reason) { //参数二
log('Failed: ' + reason);
});
promise的all和race方法
all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。最后多个函数得到的resolve值都会放在同个then里面,all会把所有异步操作的结果放进一个数组中传给then,也就是下面的results数组
Promise
.all([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
console.log(results);
});
中文翻译是赛跑的意思,他的用法很all相同,都是意思恰好是相反的,all是等所有的回调方法都执行完毕,才then,只要所有方法之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数.
Promise
.race([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
console.log(results); //如果runAsync1先运行完,then就自己输出runAsync1的resolve值,但是其他的方法还是会继续执行.
});
下面介绍实战篇
let por = new Promise((r, j) => {
方法一
})
.then(() => {
方法二
}
)
是不是简单且容易实现~~~~~~~~