一.Promise的理解和使用
-
Promise是什么 ==> 承诺,许诺(数据)
抽象表达:Promise是js中进行异步编程新的解决方案(旧:纯回调从事)
具体表达:从语法上来说:Promise是一个构造函数
从功能上来说:Promise对象用来封装一个异步操作并可以得到其异步执行的结果
-
Promise的状态改变
-
pending变为resolved
-
pending变为rejecter
说明:只有这两种,且一个Promise对象只能改变一次,无论变为成功还是失败,都会有一个结果数据,成功的结果数据一般称为value,失败的结果数据一般称为reason
-
二.Promise基本使用信息
//1.创建一个Promise对象
const pro = new Promise ((resolve,reject)=>{ //执行器函数
//2.执行异步操作任务
//3.1成功调用resolve(value)
if(time%2==0){
resolve('成功的数据','time'+time)
}else{
//3.2失败调用reject(value)
reject('失败的数据','time'+time)
}
})
pro.then(
value=>{ //接收成功的value数据 onResolved
console.log("成功时的回调",value);
},
reson=>{ //接收失败的value数据 onReject
console.log("失败时的回调",value);
}
)
三.为什么使用Promise
-
指定回调函数更加灵活
旧的:必须在启动异步任务前指定
Promise:启动异步任务 => 返回Promise对象 => 给Promise对象绑定回调函数(甚至可以异步任务结束后指定)
//成功的回调函数 function successCallback(result){ conslo.log("声音文件创建成功:" + result) } //失败的回调函数 function failureCallback(error){ conslo.log("失败文件创建成功:" + error) } /*使用纯回调函数*/ //先设置回调,再解决设置异步任务 createAudioFileAsync("异步任务",successCallback,failureCallback) //使用Promise 执行器函数先执行,同步回调,先启动异步任务,在进行异步回调,可以后设置回调,结束后设置也可以 const promise = createAudioFileAsync("异步任务"); promise.then(successCallback,failureCallback); //成功回调,失败回调 -
支持链式调用,可以解决回调地域的问题
//回调地域 //什么是回调地域:回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数执行的条件 //回调地域的缺点:不便于阅读,不便于处理异常 //解决方案:promise链式调用 async/await doSomething(function(result){ //多个异步回调操作,并且串联执行 doSomethingElse(result,function(newResult){ doThidThing(newPesult,function(finalResult){ console.log(finalResult) },failureCallback) //失败的回调,难以解决 },failureCallback) },failureCallback) //使用Promise的链式调用解决回调地域 doSomething.then(function(result){ //自上而下写法便于阅读 return doSomethingElse(result); }) .then(function(newResult){ return doThidThing(newResult); }) .then(function(finalResult){ console.log(finalResult); }) .catch(failureCallback) //失败回调集中式处理 //使用 async/await:解决回调地域 async function request(){ //从源码看是没有回调函数 try { const result = await doSomething(); //接收成功后的结果 const newResult = await doSomethingElse(result); //传递给下个方法 const finalResult = await doThidThing(newResult); } catch(error) { failureCallback(error); //失败的处理 } }