Promise(1) | setTimeout实现异步

78 阅读2分钟

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>