获取异步操作的数据
1. 错误方法
function getData(){
setTimeout(function(){
var name='yzy';
return name // 位置1
},1000)
return name // 位置2
}
console.log(getData())
当执行函数getData时,setTimeout为异步任务,此时函数中无法立即执行setTimeout函数
- 如果在位置1返回,此时函数体内部没有任何语句,最后将在控制台输出undefined
- 如果在位置2返回,此时函数体内部只有return name,由于name没有定义,最后将会报错
2. 解决方法
2.1 用回调函数
function getData(callback){
setTimeout(function(){
var name='yzy';
callback(name)
},1000)
}
getData(function(aaa){
console.log(aaa) //1s后输出yzy
})
2.2 用Promise.then的方法
function getData(resolve, reject) {
setTimeout(function () {
var name = 'yzy'
resolve(name)
}, 1000)
}
var p = new Promise(getData)
p.then(function (data) {
console.log(data)
})
原理:将任务包装为一个异步微任务,不会阻碍其他任务的执行
2.3 用async、await方法
async function test() {
return new Promise((resolve, reject) => {
setTimeout(() => {
var name = 'yzy'
resolve(name)
}, 1000)
})
}
async function main() {
var data = await test()
console.log(data) //返回值为 'aaaa'
}
main()