什么是async和await

你要想理解语法,可以先从两个单词的基本意思来进行了解.async是异步的简写,而await可以堪称async wait的简写。明白了两个单词,就很好理解了async是声明一个方法是异步的,
await是等待异步方法完成。注意的是await必须在async方法中才可以使用因为await访问本身就会造成程序停止堵塞,所以必须在异步方法中才可以使用。

async到底起什么作用?

async是让方法变成异步,这个很好理解,关键是他的返回值是什么?我们得到后如何处理?

根据以前的经验,我们希望用return直接返回async函数的值,但是如果真是这样,还有await什么作用,我们写段代码测试一下。
async function testAsync(){
    return 'Hello async';
}
const result = testAsync();
console.log(result);
在终端里用node执行这段代码,你会发现输出了Promise { ‘Hello async’ },这时候会发现它返回的是Promise。
node test.js
Promise { 'Hello async' }
async就是将函数返回值使用 Promise.resolve 包裹了下,和then中处理返回值一样,并且async只能配合await使用

await在等什么?

await一般在等待async方法执行完毕,其实await等待的只是一个表达式,这个表达式在官方文档里说的是Promise对象,可是它也可以接受普通值。我们写一段代码来验证一下这个结果。
在程序中我们有用async的方法,也有普通的方法。最后在控制台输出时,你会发现都可以直接输出。
function getSomething(){
    return 'something';
}
 
async function testAsync(){
    return 'Hello async';
}
 
async function test(){
    const v1=await getSomething();
    const v2=await testAsync();
    console.log(v1,v2);
}
 
test();

async/await同时使用

通过前面两个例子已经分别了解async和await,我们来作个虚假的例子,看一下等待问题。这只是一个虚假的,实际项目中多是去后台请求数据,等数据回来后进行执行。
function takeLongTime() {
    return new Promise(resolve => {
        setTimeout(() => resolve("long_time_value"), 1000);
    });
}
 
async function test() {
    const v = await takeLongTime(); 
    console.log(v);
}
 
test();

 所以调用的时候就可以这样简洁用 不用再then语法了 

takeLongTime().then(()=>{

}).catch((err)=>{

})

 项目应用 异步的数据同步化

import { subPicture } from '@/api/user'  // async await 基于promise 所以 这里的封装也是基于了这个

async getJDCulbShow(i) {
      try {
        const res = await subPicture(i)

        if (res.ret === 0) {
          this.$message({
            message: '成功',
            type: 'success'
          })
          console.log(res)
        } else {
          this.$message({
            message: res.msg,
            type: 'error',
            center: true
          })
        }
      } catch (err) {
        console.log('获取数据失败', err)
      }
    }

this.getJDCulbShow(formData)

 使用前后的对比

// 用 promise 获取文件内容
function getFileContent(fileName) {
    const promise = new Promise((resolve, reject) => {
        const fullFileName = path.resolve(__dirname, 'files', fileName)
        fs.readFile(fullFileName, (err, data) => {
            if (err) {
                reject(err)
                return
            }
            resolve(
                JSON.parse(data.toString())
            )
        })
    })
    return promise
}
// 使用前
// getFileContent('a.json').then(aData => {
//     console.log('a data', aData)
//     return getFileContent(aData.next)
// }).then(bData => {
//     console.log('b data', bData)
//     return getFileContent(bData.next)
// }).then(cData => {
//     console.log('c data', cData)
// })

// 使用后
async function readFileData() {
    // 同步写法
    try {
        const aData = await getFileContent('a.json')
        console.log('a data', aData)
        const bData = await getFileContent(aData.next)
        console.log('b data', bData)
        const cData = await getFileContent(bData.next)
        console.log('c data', cData)
    } catch (err) {
        console.error(err)
    }
}

axios的async写在哪 async怎么使用_Async

 总结

// async await 要点:
// 1. await 后面可以追加 promise 对象,获取 resolve 的值
// 2. await 必须包裹在 async 函数里面
// 3. async 函数执行返回的也是一个 promise 对象
// 4. try-catch 截获 promise 中 reject 的值

axios的async写在哪 async怎么使用_axios的async写在哪_02