js异步线程--超级线程

目录

promise

例一

例二

例三

例四

例五--(多线程加载图片,模拟分布式项目)

Genertor

超级线程(必须用*修饰,和关键字yield)

例一



promise

例一

普通版本:

    {
      //异步线程
      const p = new Promise(function(resolove,reject){
        // resolove("成功");//成功返回调用
        reject("失败");     //失败返回调用
      });
      //调用
      p.then(
        function success(value){
          console.log(value);
        },
        function error(error){
          console.log(error);
        }
        );
     }

箭头函数版本: 

 //箭头函数版本
      const p = new Promise((resolove,reject)=>{
        // resolove("success");
        reject("error");
      }).then(
        value=>{
          console.log(value);
        },
        error=>{
          console.log(error);
        }
      );

例二

一个线程执行操作,执行完毕调用另一个线程显示结果

实例:老王买饼,吃饼

{
        //根据输入的mood的值来决定返回是什么
      const getJianBing = mood => new Promise((resolve,reject)=>{
        if (mood) {
          const JianBing = {
              append:"鸡肉味煎饼",
              money:10
          }
          resolve(JianBing);
        }else{
          const reason = new Error("今天星期不好,所以不带");
          reject(reason);
        }
      });

      //调用
      const askWang = getJianBing(false).then(
        value=>{
          console.log("买的是"+value.append+"需要"+value.money+"钱");
        },
        error=>{
          console.log(error);
        }
        );
    }

例三

一个线程加载图片,一个线程显示图片

 {
      //加载图片 Promise:许诺,承诺
      const loading = url => new Promise((resolve,reject)=>{
          const img = new Image();
          img.src = url;
            //这就是加载方法
          img.onload = () =>resolve(img);
            //加载失败方法
          img.onerror = () =>reject(url);
      });

      //显示图片线程
      //querySelector() 方法仅仅返回匹配指定选择器的第一个元素
      //如果你需要返回所有的元素,请使用 querySelectorAll() 方法替代
      const img2 = document.querySelector("img");
      loading("http://img.ivsky.com/img/tupian/pre/201804/02/shenmi_dongxue-004.jpg").then(
          value=>{
            img2.src = value.src;
          }
        )
    }

例四

修改裸板ajax为Promise方法

 const ajax = (url,succ,fail) => {
        const xhr = new XMLHttpRequest;
        xhr.open("GET",url);
        xhr.onreadystatechange = function(){
          if(this.readyState === 4){
            if(this.status === 200){
              succ(this.response);
            }else{
              fail(this.statusText);
            }
          }
        }
        xhr.send();
      }

      //调用
      ajax("http://localhost:8080/AAA/servlet/AAA",function(data){console.log(data)},function(error){console.log(error)});

改写调用方法为promise

//改造调用方法
      new Promise((resolve,reject) => {
        ajax("http://localhost:8080/AAA/servlet/AAA",resolve,reject);
      }).then(
        value => console.log(value);
      );

改写ajax

  //改写之后的ajax
      const ajax = url => new Promise((resolve,reject) => {
        const xhr = new XMLHttpRequest;
        xhr.open("GET",url);
        xhr.onreadystatechange = function(){
          if(this.readyState === 4){
            if(this.status === 200){
              resolve(this.response);
            }else{
              reject(new Error(this.statusText));
            }
          }
        }
        xhr.send();
      })

      //调用
      ajax("http://localhost:8080/AAA/servlet/AAA").then(
            value => {
              console.log(value);
            },
            error => {
              console.log(error);
            }
       );

例五--(多线程加载图片,模拟分布式项目)

 //开启多个线程,同时加多个服务器的图片,当有一个加载完毕,立即通知显示线程,显示图片
      const loadImage = url => new Promise((resolve,reject) => {
        const img = new Image();
        img.src = url;
        img.onload = () => resolve(img);
        img.onerror = () => reject(url);
      });
      const PromiseImage = [loadImage("http://img.ivsky.com/img/tupian/pre/201804/02/shenmi_dongxue-004.jpg"),
                            loadImage("http://img.ivsky.com/img/tupian/pre/201804/02/shenmi_dongxue-005.jpg"),
                            loadImage("http://img.ivsky.com/img/tupian/pre/201804/02/shenmi_dongxue-008.jpg")
                            ];
     

      //多个加载,显示多个
      Promise.all(PromiseImage).then(
          values => {
            values.forEach(
                v => document.body.appendChild(v);
              )
          },
          error => {
            console.log(error);
          }
        )
      
      //多个加载,显示最快的那个
      Promise.race(PromiseImage).then(
          value =>{
            document.body.appendChild(value);  
          },
          error => {
            console.log(error);
          }
        )

Genertor

超级线程(必须用*修饰,和关键字yield)

这种线程,每次执行,都只执行一部分

每次执行到yield的返回值结束,yield前面的部分和下面的代码一起执行这里容易出题

//Genertor
      let tell = function*(){
        yield 'a';
        yield 'b';
        yield 'c';
        yield 'd';
        return 12;
      }

      let k = tell();
      console.log(k.next());
      console.log(k.next());
      console.log(k.next());
      console.log(k.next());
      console.log(k.next());

      // {value: "a", done: false}
      // {value: "b", done: false}
      // {value: "c", done: false}
      // {value: "d", done: false}
      // {value: 12, done: true}

例一

模拟抽奖:每次点击就抽一次,每个人有5次的机会

 //通报剩余抽奖次数的方法
      let draw = function(count){
        //具体事务
        console.log(`剩余${count}次`);
      }

      //抽奖真正的方法
      //每次都执行一次,到了五次以后就等于0
      let resider = function *(count){
        while(count>0){
          count--;
          yield draw(count);
        }
      }
      
      //开始抽奖
      //调用方法
      let start = resider(5);
      //创建一个按钮
      let btn = document.createElement("Button");
      //设置他的ID为
      btn.id = "start";
      //按钮的内容
      btn.textContent = "抽奖";
      //在body里面添加该按钮
      document.body.appendChild(btn);
      //获得该按钮并绑定事件
      document.getElementById("start").addEventListener("click",function(){
        start.next();
      },false);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript 是一门单线程的编程语言,意味着它在任意给定的时刻只能执行一个任务。这是因为 JavaScript 在最初设计时是作为浏览器脚本语言而诞生的,用于操作网页的 DOM(文档对象模型)。 在 JavaScript 中,任务按照它们被调用的顺序执行,这种方式称为同步执行。当一个任务执行时,其他任务必须等待它的完成才能继续执行。这种同步执行的特性可以确保数据的一致性,但也可能导致阻塞,特别是在执行耗时较长的任务时。 为了解决阻塞问题,JavaScript 引入了异步执行的概念。通过异步执行,可以让某些任务在后台执行,而不会阻塞其他任务的执行。常见的异步操作包括网络请求、文件读写和定时器等。在 JavaScript 中,通常使用回调函数、Promise、async/await 等方式来处理异步操作。 回调函数是最早被广泛使用的异步处理方式。通过将一个函数作为参数传递给异步操作,在操作完成后调用该函数来处理结果。然而,使用回调函数嵌套多层会导致代码可读性和维护性的降低,这就是所谓的"回调地狱"问题。 为了解决回调地狱问题,Promise 和 async/await 出现了。Promise 是一种用于处理异步操作的对象,它可以链式调用,避免了回调函数嵌套的问题。而 async/await 是基于 Promise 的语法糖,使异步代码看起来更像同步代码,更易于理解和编写。 总结起来,JavaScript 是单线程的,但通过异步执行可以提高程序的性能和响应速度。同步执行保证了数据的一致性,而异步执行允许在后台处理耗时操作,提高了用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值