vue3 async和await联合调用接口 🔥一文搞定
上期推文中讲述了vue3项目实战中接口调用的相关知识点,介绍了调用接口的过程和简要方法。🔥点击复习vue3项目实战中接口的调用🔥
从本期文章开始将会不定时更新 vue3项目实战中接口调用的三大方法。👏👏👏本期文章将重点介绍vue3的 async和await实现异步请求接口
(👏👏👏欢迎大佬们多多指教!)
在进行实际开发时会遇到异步请求的问题,这时候我们异步请求的存在就非常具有合理性了。
async是异步的意思,而await是等待的意思,await用于等待一个异步任务执行完成的结果。
🔥1.
async/await是一种编写异步代码的新方法(以前是采用回调和promise)。
2.async/await是建立在promise的基础上。
3.async/await像promise一样,也是非阻塞的。
🔥4.async/await让异步代码看起来、表现起来更像同步代码。
👇👇 基本格式 如下:
async function queryData(id) {
const ret = await axios.get('/data');
return ret;
}
queryData.then(ret=>{
console.log(ret)
})
示例1(详细版含注解):

源码:
const initGetList = async () => { // 函解构用async和await包裹
const {data:res} = await getList(data) // 获取接口调用函数getList中的值data 其中data是表单里的数据
// 对data进行解构赋值 取出请求的结果res
console.log(res) // 控制台打印结果 => 请求成功 code为200
data.list = res.data // 将请求结果的data值赋给data.list 方便表格table与之数据双向绑定
}
initGetList() //调用函数
这是一个请求后端接口,并将数据返回到后台管理的table表格上的例子。
template部分代码:(UI组件库使用的是Ant Design Vue)

<a-table :data-source="data.list" :columns="columns" style="width:100%"></a-table>
示例2:
// 配置请求的基准URL地址
axios.defaults.baseURL = 'http:localhost:3000';
//axios请求接口
axios.get('adata').then(function(ret){
console.log(ret.data)
})
//async请求接口 await后面是Promise实例对象
async function queryData() {
var ret = await axios.get('adata');
// console.log(ret.data)
return ret.data;
}
queryData().then(function (data) { // 赋值过程
console.log(data)
})
//服务器端的接口
app.get('/adata', (req, res) => {
res.send('Hello axios!')
})
实际开发中,肯定会遇到关于发送请求获取数据的问题。例如:如果你遇到了 等第一个请求返回数据完,再执行第二个请求(可能第二个请求要传的参数就是第一个请求接口返回的数据) 【同步请求】这个问题,该怎么去处理呢?由于我们在不使用异步请求的情况下,默认发送多个请求是同步执行的,就会导致我们也不知道到底是哪个接口优先被执行!!!所以,我们必须要学会使用async/await实现异步请求!!!
验证登录:

源码:
// 验证登录
// async 和 await 包裹需要请求的对象的值 相当于对axios的一个二次封装
const handleFinish = async (value: any) => { // 表单输入完毕后点登录调用handleFinish函数
// async包裹handleFinish函数的参数value 传参
console.log(value)
const {data:res} = await userLoginApi(value) // 对data解构赋值 取出请求结果res data是请求接口中存放表单数据的变量
// 先从请求接口的函数userLoginApi中获取存入的表单数据value 然后用await包裹 赋值给请求结果res
console.log(res)
if(res.code === 20001){ // 这里的20001来自浏览器中 要看清楚是成功的值还是失败的值
console.log('login successfully')
message.success('login succesfully') // 数据验证通过弹出跳转成功提示框
// 用对话存储的方法set(送进去)一个token
window.sessionStorage.setItem('token',res.data.tokenValue) // token的位置从浏览器控制台中可以得到
router.push("/home") // 数据验证成功后跳转页面
} else {
message.error('请求失败 请重新输入') // 数据验证不成功则弹出错误提示框
console.log('error')
}
};
表格数据:(更多见示例一)


示例1:
// 配置请求的基准URL地址
axios.defaults.baseURL = 'http://localhost:3000';
//async请求接口
async function queryData() {
var info = await axios.get('async1');
//axios传递给服务器/async2接口的info.data参数,用于接口内部判断
//传参格式:[ '地址?属性名=属性值' ]or [ ' 地址?对象= ' + '对象.属性名']
var ret = await axios.get('async2?info=' + info.data);
return ret.data;
}
queryData().then(function(data){
console.log(data)
})
//服务器端的接口
app.get('/async1', (req, res) => {
res.send('hello')
})
app.get('/async2', (req, res) => {
if (req.query.info == 'hello') {
res.send('async1的结果确实是hello')
} else {
res.send('error')
}
})

示例2:
const datas = async ()=> {
await request.selectPies(Route.path.split('/')[3]).then(res=>{
states.ids = res.obj
console.log(res)
})
//查询发帖子用户信息
await request.selectUsers(states.ids).then(res=>{
console.log(res.obj)
})
}
datas()
这里是在vue3 setup语法糖中使用异步请求,从代码看出,第二个接口要使用第一个接口返回的数据,因此使用了异步请求。
在前后端分离的开发模式下,需要访问后端接口,我们必须要懂得什么是异步请求——给接口的访问加上了顺序,防止它们无厘头的不受顺序限制发送请求!
以上就是vue3项目实战中接口调用方法——async/await用法的详细内容。后期会对剩余两种接口调用方法 fetch axios不定期更新!!
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent