console.log(res2, “res2------”);
});
这个时间控制台打印次序发生了变化,先输出2,后输出1
固然接口一写在前面,但是由于其比较耗时,导致先输出接口二的效果,显然这不满意我们最开始的需求。那么如何在不确定接口返回时间的情况下,控制接口输出的次序呢?这时间就该使用第一种实现方案了–Promise。
在Promise中,使用then()控制实行次序,当Promise中实行了resolve(),才会继承实行then()内里的,因此这个时间可以把接口一放到Promise内里,接口二放入then()内里,当接口一请求乐成之后实行resolve(),才会继承往下调用then()内里的接口二。
new Promise((resolve, reject) => {
let url = https://api.apiopen.top/singlePoetry;
this.$axios.get(url).then((res) => {
setTimeout(() => {
//模拟耗时操纵
console.log(res, “耗时返回的res”);
resolve(“success”);
}, 1000);
})
}).then(()=>{ //上一个接口乐成resolve之后实行then()
let url2 = https://api.apiopen.top/getJoke?page=1&count=2&type=video;
this.$axios.get(url2).then((res2) => {
console.log(res2, “res2------”);
})
})
控制台按次序输出,可以实现需求。
那么假如存在两个接口以上,同样必要按次序,仍旧可以使用Promise,但是留意接口二必要返回一个Promise对象。
new Promise((resolve, reject) => {
let url = https://api.apiopen.top/singlePoetry;
this.$axios.get(url).then((res) => {
setTimeout(() => {
//模拟耗时操纵
console.log(res, “耗时返回的res”);
resolve(“success”);
}, 1000);
})
}).then(()=>{
return new Promise((resolve,reject)=>{ //留意该处必要返回一个Promise对象
let url2 = https://api.apiopen.top/getJoke?page=1&count=2&type=video;
this.$axios.get(url2).then((res2) => {
console.log(res2, “res2------”);
resolve(“success”);
})
})
}).then(()=>{
//其他接口,此处用setTimeout模拟异步请求
setTimeout(()=>{
console.log(‘res3------’)
},100)
})
控制台打印输出效果,实现按次序。
假如有3、4、5个甚至更多的呢,同样的写法,除了末了一个(当然末了一个也可以返回),中央的都必要返回一个Promise对象,因为这样才气使用then()方法实现按次序实行,并且每个接口返回乐成之后实行resolve()。
更多细节请参考JavaScript Promise | 菜鸟教程
以上的Promise在调用的接口数量少还可以使用,但是当接口很多,使用其就显得有点繁琐,层层回调,导致回调炼狱。在真实工作场景中一样平常使用相对简朴的方式(也是最容易实现的方式)。
使用axios时每一个异步请求都有一个then()方法,代表请求乐成,那么我们可以在调用第一个接口乐成时,也就是在每个axios的then()内里再去调用下一个接口。
let url = https://api.apiopen.top/singlePoetry;
this.$axios.get(url).then((res) => {
console.log(res, “真实工作场景!”);
let url2 = https://api.apiopen.top/getJoke?page=1&count=2&type=video;
this.$axios.get(url2).then((res2) => { //在第一个接口请求完成之后调用下一个,保证次序
console.log(res2, “res2------”);
//继承调下一个接口…
});
});
控制台打印输出效果
扩展:Generator(了解,一个演变过程)
Generator 顾名思义是生成器,那什么是生成器?官网给出的解释: 使用 function* 语法和一个或多个 yield 表达式以创建一个函数即为生成器,当然它的返回值就是一个迭代器即生成器。生成器可以用来控制实行次序。Generator的关键是yield跟next()。
详细内容参考Generator - JavaScript | MDN
举个简朴的例子
function *gen(){
let y = yield 1 + 1;
let z = yield y + 1;
return z;
}
let step = gen()
console.log(‘generator’,step.next())
控制台打印输出情况
返回的是一个指针对象,done为false表示还没迭代完成。
此时done仍未false,继承完善代码。
function *gen(){
let y = yield 1 + 1;
let z = yield 2 + 1;
return z;
}
let step = gen()
console.log(‘generator’,step.next())
console.log(‘generator’,step.next())
console.log(‘generator’,step.next())
done为ture表示迭代完成,此时value为undefined,继承实行next()效果不变。
实现二:async await
async awiat可以说是promise的改进方案,可以让异步实行的代码看起来同步化,办理了promise的回调炼狱问题,如下对promise的实例举行改造。
promise写法
new Promise((resolve, reject) => {
let url = https://api.apiopen.top/singlePoetry;
this.$axios.get(url).then((res) => {
setTimeout(() => {
//模拟耗时操纵
console.log(res, “耗时返回的res”);
resolve(“success”);
}, 1000);
})
}).then(()=>{
let url2 = https://api.apiopen.top/getJoke?page=1&count=2&type=video;
this.$axios.get(url2).then((res2) => {
console.log(res2, “res2------”);
})
})
假如是vue项目,在methods中分别封装异步请求接口为单独方法,内里返回Promise对象,留意异步请求乐成后记得resolve()。
step1() {
return new Promise((resolve, reject) => {
let url = https://api.apiopen.top/singlePoetry;
this.$axios.get(url).then((res) => {
setTimeout(() => {
//模拟耗时操纵
console.log(res, “耗时返回的res,使用async await”);
resolve(“success”);
}, 1000);
});
});
}
step2() {
return new Promise((resolve, reject) => {
let url2 = https://api.apiopen.top/getJoke?page=1&count=2&type=video;
this.$axios.get(url2).then((res2) => {
末了
自我先容一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到如今。
深知大多数初中级Android工程师,想要提拔技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开辟全套学习资料》,初志也很简朴,就是希望可以大概帮助到想自学提拔又不知道该从何学起的朋友,同时减轻各人的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提拔的进阶课程,基本涵盖了95%以上Android开辟知识点!不论你是刚入门Android开辟的新手,还是希望在技能上不断提拔的资深开辟者,这些资料都将为你打开新的学习之门!
假如你以为这些内容对你有帮助,必要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部门目录截图出来,每个节点内里都包含大厂面经、学习条记、源码课本、实战项目、解说视频,并且会持续更新!
中…(img-WulQPXXl-1715539386222)]
[外链图片转存中…(img-R4y2UVxA-1715539386223)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提拔的进阶课程,基本涵盖了95%以上Android开辟知识点!不论你是刚入门Android开辟的新手,还是希望在技能上不断提拔的资深开辟者,这些资料都将为你打开新的学习之门!
假如你以为这些内容对你有帮助,必要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部门目录截图出来,每个节点内里都包含大厂面经、学习条记、源码课本、实战项目、解说视频,并且会持续更新!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |