<
>

JavaScript同步与异步任务问题详解

2022-07-19 12:50:50 来源:易采站长站 作者:

目录
js会出现异步问题场景标题延时操作开关涵数jQuery异步请求设置为同步请求

js会出现异步问题场景

    延时操作数据请求同异步promise>回调涵数(最常见多内置涵数支持接收回调涵数来异步代码 )事件监听 如,click事件等异步订阅与发布

    今天遇到的问题是,请求数据时间太长,会先执行之后的代码,

    初步预想的解决方法:

      使用箭头涵数,使用涵数的返回值,让请求与之后的代码 同步执行异步请求修改变成同步async/await-Promise-让异步操作同步执行开关涵数延时操作

      标题延时操作

      缺点:不知请求数据需要多长时间,之后的数据需要延迟多少时间展示,是个问题。

            function tes0t() {
              fn1();
              fn2();
              fn3();
            }
            function fn1() {
              console.log(1);
            }
            function fn2() {
              setTimeout(function () {
                console.log(2);
              }, 1000);
            }
            function fn3() {
              setTimeout(function () {
                console.log(3);
              }, 0);
            }
            tes0t();

      开关涵数

      预期输出是:1,2,3,

      实际输出是:1,3,2,

      所以达不到想要的效果

      var kai=false
            function tes0t() {
              fn1();
              fn2();
              fn3();
            }
            function fn1() {
              console.log(1);
            }
            function fn2() {
              setTimeout(function () {
                console.log(2);
                kai= true;
              }, 1000);
              //   console.log();
            }
            function fn3() {
              setTimeout(function () {
                console.log(3);
              }, 0);
            }
            tes0t();

      jQuery异步请求设置为同步请求

      是否达到预期效果,不知道

      $.ajaxSettings.async = false;//同步请求
       Global_MBPage.$gt(url, params, function (json) {}
       $.ajaxSettings.async = true;//异步请求 - 默认是异步
      

      使用箭头涵数,涵数的返回值,让请求与之后的代码 同步执行

      测试是可以达到预期效果,输出结果是1,2,3

            function tes0t() {
              fn1();
              fn2(1, 1, () => {fn3();});
            }
            function fn1() {
              console.log(1);
            }
            function fn2(n1, n2, n3) {
              setTimeout(function () {
                console.log(2);
                if (n3) n3.call();//返回值的设置
              }, 1000);
            }
            function fn3() {
              setTimeout(function () {
                console.log(3);
              }, 0);
            }
            tes0t();

      async/await-Promise-让异步操作同步执行

      function fn4(){
        return new Promise(resolve=>{
          setTimeout(function(){
            msg='等啥 '
            resolve(msg)
          },1000)
        })
      }
      async function aC(){
        var result = await fn4();
        console.log(result);
      }
      aC() 

      // 输出为‘ 等啥 ’

      到此这篇关于JavaScript同步与异步任务问题详解的文章就介绍到这了,更多相关JavaScript同步与异步 内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!

暂时禁止评论

微信扫一扫

易采站长站微信账号