1.setTimeout实现异步
<script>
console.log("start..."); //同步代码
setTimeout(()=>{ //定时器 ()=>{} 回调函数 小括号箭头大括号
console.log("xxx"); //先不调用,3s之后再调用
},3000)
console.log("end..."); //同步代码
</script>
1.1 计算0-100之和,3秒后给出结果
<script>
function fn(counter){ //整个函数是同步的
setTimeout(()=>{ //异步代码,不会执行
if(num>0){
let total = 0;
for(let i=0;i<=counter;i++){
total+=i;
}
return total
}else{
return "你传递的数据不合法"
}
},3000)
return 'ok' //代码只输出一个ok
}
console.log(fn(100)) //得不到想要的total 因为setTimeout是一个异步函数
//函数调用是去拿返回值的,默认的返回值是undefined
</script>
首先需要知道回调函数的定义,即回头再调用的函数。
所以在调用这种回调函数的时候,返回值是undefined,正常的函数都是同步执行的,所以不会回头再调用。
所以还需要在函数调用时设置两个回调函数,()=>{},小括号箭头大括号
在函数定义的时候,把原先的return 改成 对应的参数名称(),加上返回值即可。
如下代码中,调用fn函数时内部有三个参数, 第一个参数是加到多少, 第二个参数是一个回调函数,()内写的变量用来接收函数的返回值 第三个参数也是一样,一个回调函数。
但是整个函数的返回值,还是和fn中的同步函数一致的。 使用回调函数,只是将输出推迟了3s
正确代码:
<script>
function fn(counter,successCallback,failureCallback){
setTimeout(()=>{
if(counter>0){
let total = 0;
for(let i=0;i<=counter;i++){
total+=i;
}
successCallback(total)
}else{
failureCallback("你传递的数据不合法")
}
},3000)
return 'ok'
}
let res = fn(100,(value)=>{
console.log('执行成功了:',value);
},(reason)=>{
console.log('执行失败了:',reason);
})
console.log("res:",res)
</script>