Promise
理解概念:回调函数。函数被当做参数且满足肯定条件后是回调函数
setTimeout(function(){
console.log("3s后执行回调函数"); // 函数参数就是回调函数
},3000);
异步工作:不阻塞前面工作的执行。跨栏式执行叫做异步工作。
const p = new Promise(function(resolve,reject){
setTimeout(function(
let data = "从数据库\网络取得数据";
resolve(data);
let err = "取得数据失败";
reject(err);
),3000);
});
p.then(function(value){
console.log("");
},function(reason){
})
// promise封装读取文件readFile异步函数
// promise封装这种慢动作十分有用
const fs = require("fs");
const p = new Promise(function(resolve,reject){
fs.readFile("./resouse/为学.md",(err,data)=>{
if(err) reject(err); // 失败
resolve(data); // 胜利
});
});
p.then(function(value){
console.log(value.toString());
},function(reason){
console.err("读取失败");
})
// promise 封装Ajax/http申请
const p = new Promise(function(resolve,reject){
// 1.Ajax创建对象
const xhr = new XMLHttpRequest();
// 2.初始化
xhr.open("GET","https://api.apiopen.top/getJoke");
// 3.发送
xhr.send();
// 4.绑定事件,解决响应后果
xhr.onreadystatechange = function(){
if(xhr.readyState = 4){
if(xhr.status >=200 && xhr.status<300){
console.log(xhr.response);
}else{
console.error(xhr.status);
}
}
}
});
Promise
中.then()
办法
// 1.先创立一个promise对象
const p = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve("ok"); // 这条语句是设置p对象的状态为胜利 并且能够设置PromiseValue为ok
},1000)
});
// 2.then办法的返回对象也是promise对象 result是对象
const result = p.then((value)=>{
// 如果return 的不是promise对象 ,则result的状态固定是resolve类型的promise
// 如果return 的是promise对象,则result的状态和return的promise对象保持一致
// 如果没有return,而是throw,则result的状态固定是rejected类型的promise
return "123"; // 此时result就是resolve的promise对象
return new Promise((resolve,reject) =>{ // 此时result就是return回的新的promise对象
resolve("ok");
})
throw "...";
},(reason)=>{
})
// Promise对象
Promise{
PromiseStatus : "resolved",
PromiseValue : "ok",
}
因为.then
能够返回promise
对象,所以.then()
能够进行链式回调。这种链式回调解决了回调天堂的问题
p.then((value)=>{
// 异步工作1
},(reason)=>{}).then((value)=>{
// 异步工作2
},(reason)=>{}).then((value)=>{
// 异步工作3
})
Promise
是对一般异步的一种封装,这是一种优化对象,没有promise
也能够用,只是有了能够解决诸如回调天堂的问题
Promise
中.catch()
办法
.catch
其实是一种非凡的.then()
办法,专门用来做Promise
对象为rejected
的时候所做的解决;省略了.then
中第一个回调参数(value)=>{}
.catch((err)=>{ // 最大的用途就是这
console.log(err);
})
发表回复