一,promise

什么是同步,什么是异步?一张图就能说明

比如写一个中奖程序,首先要生成一个数字,写一个方法生成范围随机数

//Math.floor(…) 会将浮点数向下取整,得到一个整数。这确保了生成的数是一个整数。
function getRandomInt(min, max){
return Math.floor(Math.random() * (max – min + 1)) + min;
//Math.random() 生成一个介于 0 到 1 之间的数
}

使用promise

const p = new Promise((resolve, reject) =>{
setTimeout(()=>{ //1000毫秒之后开始执行
let n = getRandomInt(1 , 100) //生成【1,100】任意一个数
if(n <= 30 ){
resolve(n); //传入n值
}else{
reject(n);
}
},1000)
})

p.then((n)=>{
console.log(`恭喜,你中奖了!号码是${n}`)// 成功时这里再打印出来
},(n)=>{
console.log(`再接再厉,号码是${n}`)//失败打印出这里
})

如果要retuen的格式需要改一改

function reachButton (){

return new Promise((resolve, reject) =>{
setTimeout(()=>{ //1000毫秒之后开始执行
let n = getRandomInt(1 , 100) //生成【1,100】任意一个数
if(n <= 30 ){
resolve(n);
}else{
reject(n);
}
},1000)
})

}
const getResult = ()=>{
reachButton().then(n=>{
console.log(`恭喜,你中奖了!号码是${n}`)
})
.catch(n=>{
console.log(`再接再厉,号码是${n}`)
})
}

这里想说一下function和const

fuction就如其意方法,一般写方法时使用格式为function 方法名字(){…}需要调用比如:方法名();不然不会执行

const 一般就是和某个按钮相绑定比如上文的点一下确定才执行一般格式const 方法名= ()=>{…}

下面试一下请求检验一下

首先那我节选了咸虾米老师的青年新闻项目中的部分

获得导航头部信息:

function narv() {
return new Promise((resolve,reject)=>{
uni.request({
url:”https://ku.qingnian8.com/dataApi/news/navlist.php”,
success:res=>{
resolve(res);
},
fail:err=>{
reject(err);
}
})
})
};

通过头部信息筛选,选出下一个请求所要的参数,传入id

function narvList(id) {
return new Promise((resolve,reject)=>{
uni.request({
url:”https://ku.qingnian8.com/dataApi/news/newslist.php”,
data:{
cid:id,
},
success:res=>{
resolve(res);
},
fail:err=>{
reject(err);
}
})
})
};

传值也要注意api作者所封装的参数格式,参数名不同,比如套娃内容放到两个data下面,id 用cid选择的api一定要看清楚,比如下面的

下一步获取文章下面的评论

function getComment(id) {
return new Promise((resolve,reject)=>{
uni.request({
url:”https://ku.qingnian8.com/dataApi/news/comment.php”,
data:{
cid:id,
},
success:res=>{
resolve(res);
},
fail:err=>{
reject(err);
}
})
})
};

通过以上网络请求通过promise链式调用会简便,有逻辑

//返回 Promise 对象,这使得外部链式调用then。
narv().then(res=>{
console.log(res.data);
let id = res.data[0].id;
return narvList(id);
}).then(listres=>{
console.log(listres.data);
let id = listres.data[0].id;
return getComment(id);
}).then(res=>{
console.log(res.data);
}).catch(err=>{
console.log(err);
})

//每个 id 的值都是在其对应的异步操作完成后赋值的,
//因此它们可以在后续的 .then() 中被独立使用,而不会互相干扰。

其实可以可以观察到这三个请求样式一样,可以封装请求,这样就可以用一个不用都写一大堆,就像第一篇写的那样

async和await是基于promise的升级版本,以更同步的方式书写异步代码

// 使用 async/await 处理链式调用
const fetchData=async()=> {
try {
const res = await narv();
console.log(res.data);
const id = res.data[0].id; // 直接获取 id
const listId = await narvList(id);
console.log(listId.data);
const commentId = listId.data[0].id; // 直接获取评论 id
const comments = await getComment(commentId);
console.log(comments.data);
} catch (err) {
console.log(err);
}
}

// 调用 fetchData 函数
fetchData();

这里以上api采用咸虾米老师项目:青年帮新闻

咸鱼还是鱼
最后更新于 2024-09-25