Js 异步请求按顺序调用解决方案(真实工作场景,axios、Promise、async await)

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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
中…(img-WulQPXXl-1715539386222)]

[外链图片转存中…(img-R4y2UVxA-1715539386223)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue中,可以通过封装axios来实现使用同步写法的接口调用。你可以创建一个api.js文件,全局创建一个api实例,并使用async和await关键字来实现异步接口的封装。 在api.js文件中,你可以定义一个叫做api的对象,该对象包含两个方法get和post。这两个方法分别用于发送GET和POST请求。在这些方法内部,使用try-catch语句来处理可能的错误,并通过await关键字等待axios返回的异步结果。 在get方法内部,你可以使用await关键字等待axios发送GET请求并返回结果。你可以在这个方法内部根据返回的结果进行处理,并根据code的值来决定是resolve还是reject Promise。 在post方法内部,你可以使用await关键字等待axios发送POST请求并返回结果。同样,你可以根据返回的结果进行处理,并根据code的值来决定是resolve还是reject Promise。 最后,你可以在export语句中导出api对象。这样,在其他地方引入api.js文件后,就可以直接使用api.get和api.post来发送请求了。 示例代码如下所示: ```javascript import axios from 'axios' const qs = require('qs') const api = { async get(url, data) { try { let res = await axios.get(url, {params: data}) res = res.data return new Promise((resolve) => { if (res.code === 0) { resolve(res) } else { resolve(res) } }) } catch (err) { alert('服务器出错') console.log(err) } }, async post(url, data) { try { let res = await axios.post(url, qs.stringify(data)) res = res.data return new Promise((resolve, reject) => { if (res.code === 0) { resolve(res) } else { reject(res) } }) } catch (err) { alert('服务器出错') console.log(err) } }, } export { api } ``` 然后,在Vue组件的代码中,你可以引入api.js文件并使用api对象来发送请求。例如,在view/app组件中,你可以在created生命周期钩子函数中调用getAllChannelsAPI方法来获取所有频道的数据。 示例代码如下所示: ```javascript import { getAllChannelsAPI } from '@/api' export default { async created() { const res = await getAllChannelsAPI() console.log(res) } } ``` 这样,你就可以使用async和await关键字结合封装的api对象来实现axios接口异步调用了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用async await 封装 axios](https://blog.csdn.net/sky2714/article/details/80950671)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [VUE(仿今日头条项目)【1】封装axios函数与封装接口方法(async和await)](https://blog.csdn.net/weixin_51612770/article/details/126678266)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值