2020/12/22工作中遇到的问题
问题记录:现在有一个父组件A,一个子组件B,子组件通过$emit触发父组件中的异步任务,并且需要在父组件中的方法拿到结果之后再进行下一步操作。这就是一个典型的需要控制异步任务顺序的问题,知道需要用到async,await来控制执行顺序,但是对其概念和用法太过含糊,所以特意学习了以下。
async/await是写异步代码的新方式,再这之前处理异步的方式是通过promise和回调函数来实现。
async会把一个普通函数变成一个异步函数,并且默认是返回一个promise对象,比如
async function my_asyncFunc(){
return '我是一个promise对象'
}
console.log(my_asyncFunc())
打印结果是
因为是一个promise对象,我们同样可以通过链式调用来得到对应的值
async function my_asyncFunc(){
return '我是一个promise对象'
}
console.log(my_asyncFunc().then(res=>{console.log(res)}))
打印
async/await可以控制异步的执行顺序,可以让promise对象的状态变为fulfilled再执行下面的语句
let a = 1
function mysyncFunc(a) {
return new Promise((reslove, reject) => {
setTimeout(() => {
a = a + 1
console.log(a);
reslove(a)
}, 2000)
})
}
async function myFunc(a) {
await mysyncFunc(a)
console.log('我的操作是在异步方法之后');
}
myFunc(a)
mysyncFunc是一个函数,里面有一个定时器,调用myFunc方法,期望等到定时器执行之后,再进行下一步操作,就可以用到await来控制函数的运行。这就类似今天项目中遇到的问题,mysyncFunc需要return 一个promise对象。
也可以通过回调函数来实现
let a = 1
function mysyncFunc(a, callback) {
setTimeout(() => {
a = a + 1
console.log(a);
callback(a)
}, 2000)
}
function myFunc(a) {
mysyncFunc(a, function (Number) {
console.log('我的操作是再异步方法之后', Number);
})
}
myFunc(a)