首先javascript语言是一门“单线程”的语言
Promise是es6新增的一种异步编程的一种解决方案,它可以用来取Callback(回调函数)和event;
Promise的用法:在new一个Promise函数的时候,Promise必须接受一个函数对象作为参数;
在函数对象里又有两个参数,一个表示成功,一个表示失败
const P1 = new Promise (function( resolve, reject ){});
且内部有状态机制(pending,resolved,rejected)。
代表(进行中,成功(解决),失败(未解决)) 同时 我们要知道 它的状态一旦确定,是不可改变的。
- promise原型下面两个常用的方法:
- Promise.prototype.then
- Promise.prototype.catch
//then
const p1 = new Promise ( function ( resolve, reject ) {
resolve( '任务一' )
})
.then ( function ( data ) {
console.log( data )
})
//catch:相当于一种then的语法糖
//ps:语法糖(Syntactic sugar),也译为糖衣语法,指计算机语言中添加的某种语法,通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
- promise静态方法
- Promise.all()
用于将多个 Promise 实例,包装成一个新的 Promise 实例,接受一个数组作为参数,只有数组里面的每个状态都变成resolve,则新的Promise 实例状态才会变成resolve. - Promise.race()
它和Promise.all方法有些类似。Promise.all方法是谁跑的慢,以谁为准执行回调,Promise.race相反,是谁跑的快,以谁为准执行回调。
- Promise.all()
const p1 = new Promise ( function ( resolve, reject ) {
resolve( '任务一' )
})
.then ( function ( data ) {
console.log( data )
})
const p2 = new Promise ( function ( resolve, reject ) {
setTimeout( function () {
resolve( '任务二' )
},1000)
})
.then ( function ( data ) {
console.log( data )
})
Promise
.all([p1,p2]) // 先执行all中所有任务, 执行完成之后再去执行后面的任务
.then( data => {
console.log( '任务3' )
})
Promise
.race([p1,p2]) // race 谁快输出谁
.then( data => {
console.log( '任务3' )
})
then可以链式调用,也是这一点让Promise十分好用;
大家知道 jQuery 实现链式调用是return了一个this,但Promise不行!
因为then函数内返回的是一个新的Promise对象。
标准中规定:
then 方法必须返回一个新的 Promise实例;