目录
1.Promise
Promise时异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理,更强大。它最早由社区提出并实现,ES6将其写进了语言标准,同意了用法,并提供了原生Promise对象。
2.特点
1.Promise对象的状态不受外界影响
- Pending状态(进行中)
- Fulfilled状态(已成功)
- Rejected状态(已失败)
2.一旦状态改变就不会再变(两种状态的改变:成功或者失败)
- Pending =>Fulfilled
- Pending=>Rejected
3.用法
创建Promise实例
let promise = new Promise(function(resolve,reject){
resolve();
//reject();
})
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是 resolve 和 reject 同样,他们是两个函数,由js引擎提供,不用自己部署。
resolve的作用是将Promise对象状态由“未完成”变为“成功”,也就是 Pending ->Fulfilled,在异步操作成功时调用,并将异步操作的结果作为参数传递出去。
reject则是将Promise对象状态由“未完成”变为“失败”,也就是Pending=>Rejected,在异步操作失败时调用,同样的也会将异步操作的结果作为函数的参数传递出去
4.then
Promise实例生成后 可用then方法分别指定两种状态回调参数。then方法可以接受两个回调函数作为参数:
1.Promise对象状态改为Resolved时调用(必选)
2.Promise对象状态改为Rejected时调用(可选)
基本用法实例
function sleep(a){
return new Promise(function(resolve,reject){
setTimeout(resolve,a);
})
}
sleep(500).then( ()=>console.log("fff"));
首先这段代码定义了一个sleep函数,调用后等待了指定参数 500毫秒后执行then中的函数。
Promise新建后就会立即执行
执行顺序
let promise = new Promise(function(resolve,reject){
console.log("AAAA");
resolve();
});
promise.then( ()=>console.log("BBBB"));
console.log("CCCC");
//最后的结果是
//AAAA
//CCCC
//BBBB
在代码执行后,我们可以看出来打印的顺序总是AAAA CCCC BBBB。这就表明,在Promise新建后会立即执行,所以会首先生成AAAA 。然后,then方法指定的回调函数在当前脚本所在的所有任务执行完成后才会执行。所以最后生成 BBBB
结合定时器使用
let promise = new Promise(function(resolve,reject){
console.log("1");
resolve();
});
setTimeout( ()=>console.log("2"),0);
promise.then( ()=>console.log("3"));
console.log("4");
//1
//4
//3
//2
从此例子可以看出,结果输出的顺寻,由于Promise会立即执行,故先输出 1 ,而次输出4则是因为then在当前脚本任务执行完之后再执行,所以输出4,至于2和3,我们可以看出,定时器的任务输出在then的输出之后,原因就是Promise属于js引擎的内部任务,而setTimeout则是浏览器的API,而引擎内部任务优先级高于浏览器的API任务。所以返回的是此结果。