学习Promise框架(一)
Promise是什么
-
抽象表达
Promise是JS中进行异步编程的新的解决方案
-
具体表达
- 语法:Promise是个构造函数
- 功能:Promise对象用来封装一个异步操作并可以获取其结果
-
promise的状态改变
- pending变为resolved
- pending变为rejected
Promise只有这两种状态,且每个Promise只能改变一次
成功的数据成为value,失败的数据称为reason
-
Promise的运行流程
为什么要用Promise
- 纯回调的方式--------在异步任务执行之前指定回调函数
function successCallback(result){
//成功的回调函数
}
function failCallback(error){
//失败的回调函数
}
//使用纯回调函数
createAudioFileAsync(audioSettings,successCallback,failCallback)
- Promise的方式 ---------指定回调函数在异步任务执行之前或者之后都可以
//1.创建promise对象
const p = new Promise((resolve,reject) => {
//2.执行异步操作
setTimeout(()=>{
const time = Date.now();
//3.1如果成功,执行resolve(value)
if(time%2 == 0){
resolve("成功的数据,time="+time);
}else{
//3.2如果失败,执行rejecte(reason)
reject("fail Data,time="+time);
}
});
});
p.then(
value =>{
console.log('成功的回调',value);
},
reason =>{
console.log("失败的回调",reason);
}
)
指定回调函数更加灵活
支持链式调用,可以解决回调地域(回调函数嵌套调用)的问题
什么是回调地狱
使用promise的链式调用解决回调地狱的问题
doSomething().then(function(result){ return doSomethingElse(result);//第一个成功的回调函数 }) .then(function(result){ return doThirdThing(newResult);//第二个成功的回调函数 }) .then(function(finalResult){ console.log('final result:'+finalResult);//最终的成功的回调函数 }) .catch(failureCallback)//失败的回调处理,最后处理
- async/await: 回调地狱的终极解决方案-----不用写回调函数
如何使用Promise
Promise的API
-
Promise构造函数:
Promise (excutor) {}
- excutor函数:同步执行
(resolve,reject) =>{}
- resolve函数:内部定义成功时我们调用的函数
value =>{}
- reject函数:内部定义失败时我们调用的函数
reason =>{}
说明:excutor会在Promise内部立即同步回调,异步操作在执行器中执行
- excutor函数:同步执行
-
Promise.prototype.then
方法:(onResolved,onRejected)=>{}
- onResolved函数:成功的回调函数
(value)=>{}
- onRejected函数:失败的回调函数
(reasor)=>{}
说明:指定用于得到成功value的成功回调和用于得到失败reason的失败回调,返回一个新的promise对象
- onResolved函数:成功的回调函数
-
Promise.prototype.catch
方法:(onRejected) =>{}
- onRejected函数:失败的回调函数
(reason) =>{}
说明:then()的语法糖,相当于:
.then(undefined,onRejected)
-
Promise.resolve
方法:(value)=>{}
- value:成功的数据或promise对象
说明:返回一个成功/失败的promise对象
-
Promise.reject
方法:(reason) =>{}
- reason:失败的原因
说明:返回一个失败的promise对象
-
Promise.all
方法:(promises)=>{}
- promises:包含n个promise的数组
说明:返回一个新的promise,只有所有的promise都成功才成功,只要有一个失败了就直接失败
Promise.race
方法:(promises) =>{}
- promises:包含n个promise的数组
说明:返回一个新的promise,第一个完成的promise的结果状态就是最终的结果状态