首页 > 其他分享 >回调函数、Promise、Generator 函数和async

回调函数、Promise、Generator 函数和async

时间:2023-06-21 14:44:05浏览次数:38  
标签:function console log .. req Promise async 函数

看了几篇文章,受益匪浅,写几个demo看下理解是否正确:

文章链接:Generator 函数的含义与用法 - 阮一峰的网络日志 (ruanyifeng.com)   async 函数的含义和用法 - 阮一峰的网络日志 (ruanyifeng.com)

回调函数

<script>
  //----------------------------回调函数----------------------------
  function getFile(url, myCallback) {
    let req = new XMLHttpRequest();
    req.open("GET", url);
    req.onload = function () {
      if (req.status == 200) {
        myCallback(req.responseText);
      } else {
        myCallback("Error: " + req.status);
      }
    };
    req.send();
  }
  //错误url 404
  getFile("../for-test.html", (res) => {
    console.log(res); //Error: 404
  });
  //正确url
  getFile("../../for-test.html", (res) => {
    console.log(res); //test
  });
</script>

 

多重请求导致的“回调地狱”

<script>
  //----------------------------回调函数----------------------------
  function getFile(url, myCallback) {
    let req = new XMLHttpRequest();
    req.open("GET", url);
    req.onload = function () {
      if (req.status == 200) {
        myCallback(req.responseText);
      } else {
        myCallback("Error: " + req.status);
      }
    };
    req.send();
  }
  //----------------------------多重请求时出现的多重回调函数嵌套('回调地狱')----------------------------
  getFile("../../for-test.html", (res) => {
    console.log(res); //test
    getFile("../for-test.html", (res) => {
      console.log(res); //Error: 404
    });
  });
</script>

 

Promise

<script>
  //----------------------------Promise----------------------------
  //为了解决多重请求时出现的多重回调函数嵌套('回调地狱')
  function getFilePromise(url) {
    let myPromise = new Promise((myResolve, myReject) => {
      let req = new XMLHttpRequest();
      req.open("GET", url);
      req.onload = function () {
        if (req.status == 200) {
          myResolve(req.response);
        } else {
          myReject("Error: " + req.status);
        }
      };
      req.send();
    });

    return myPromise;
  }

  getFilePromise("../../for-test.html")
    .then((value) => {
      console.log(value);
    })
    .then(() => {
      return getFilePromise("../for-test.html");
    })
    .then((value) => {
      console.log(value);
    })
    .catch(function (error) {
      console.log(error);
    });
</script>

 

Generator 函数

<script>
  //----------------------------Generator 函数----------------------------
  //"协程"(coroutine),意思是多个线程互相协作,完成异步任务。
  // 协程A开始执行,协程A执行遇到异步任务,进入暂停,执行权转移到协程B。协程B完成异步任务交还执行权给协程A。协程A恢复执行。
  // Generator 函数是协程在 ES6 的实现,最大特点就是可以交出函数的执行权(即暂停执行)。使用function* funcname 和yield定义
  function* getFileGen(url) {
    try {
      let result = yield fetch(url);
    } catch (error) {
      //捕获函数体外抛出的错误
      console.log(error);
    }
    return result;
  }
  // 调用 Generator 函数,会返回一个内部指针(即遍历器 )g,调用指针 g 的 next 方法,会移动内部指针
  // next 方法的作用是分阶段执行 Generator 函数。每次调用 next 方法,会返回一个对象,表示当前阶段的信息( value 属性和 done 属性)。
  // value 属性是 yield 语句后面表达式的值,表示当前阶段的值;done 属性是一个布尔值,表示 Generator 函数是否执行完毕,即是否还有下一个阶段。
  var g = getFileGen("../../for-test.html");
  var result = g.next();
  console.log(result); //{value: Promise, done: false}
  result.value
    .then(function (data) {
      return data.text();
    })
    .then(function (data) {
      console.log(data); //test
      console.log(g.next()); //{value: undefined, done: true}
    });

  //抛出错误
  g.throw("出错了");

  //产生的问题:流程管理(即何时执行g.next())
</script>

 

标签:function,console,log,..,req,Promise,async,函数
From: https://www.cnblogs.com/caroline2016/p/17496175.html

相关文章

  • 欧拉函数,欧拉定理,费马定理
    欧拉函数:指从1-n中与n互质的数的个数首先要知道,一个数$n$分解质因数之后会变成这样一个形式:$n$= $p1k1$ +$p2k2$+...+$pnkn$而欧拉函数:$φ$=$n$*(1-1/p1)*(1-1/p2)*...*(1-1/pn).证明: 1.由于n可以被分解为p1,p2..的倍数,那么首先要用n-n/p1-n/p2......
  • C++ 中的函数重载
     在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。https://www.lekaowang.com/jszgz/zxj/lfb/......
  • HiveSQL在使用聚合类函数的时候性能分析和优化详解
    概述前文我们写过简单SQL的性能分析和解读,简单SQL被归类为select-from-where型SQL语句,其主要特点是只有map阶段的数据处理,相当于直接从hive中取数出来,不需要经过行变化。在非多个节点的操作上,其性能甚至不比Tez和Spark差。而这次我们主要说的是使用聚合类函数的hiveSQL,这类SQL需......
  • 【算法】编写一个函数,返回数字数组的“峰值”(或局部最大值)的位置和值。
    编写一个函数,返回数字数组的“峰值”(或局部最大值)的位置和值。例如,数组arr=[0,1,2,5,1,0]在位置3处具有值为5的峰值(因为arr[3]等于5)。输出将以Dictionary<string,List<int>的形式返回,其中包含两个键值对:“pos”和“peaks”。如果给定的数组中没有峰值,只需返回{“pos”=>newList<int>(),“pea......
  • 大功率平衡车,扭扭车 图纸 源码 平衡车原理图 pcb 矢量源码非库函数, Bom清单 物料表等
    大功率平衡车,扭扭车图纸源码平衡车原理图pcb矢量源码非库函数,Bom清单物料表等资料。500W功率STM32主控陀螺仪可用于学习电机开发,平衡车独轮车项目开发。ID:452500609590448918......
  • ProgressDialog在 AsyncTaskTask 中的单独使用
    publicclassAsyncClassextendsAsyncTask<Void,String,Void>{privateContextcontext;ProgressDialogdialog;publicAsyncClass(Contextcxt){context=cxt;dialog=newProgressDialog(context);......
  • Python asyncio 库源码分析
    Pythonasyncio库源码分析前言本着「路漫漫其修远兮,吾将上下而求索」的精神。终于要开始深入研究Python中asyncio的源码实现啦。本文章可能篇幅较长,因为是逐行分析asyncio的实现,也需要读者具有一定的asyncio编码经验和功底,推荐刚开始踏上Python异步编程之旅的朋......
  • Oracle系列---【REGEXP_LIKE函数的使用】
    REGEXP_LIKE函数的使用REGEXP_LIKE函数的使用场景oracle中有两张表,一张叫A_PACKAGE,另一张叫A_RULE,两张表通过PACKAGE_ID关联。其中,A_PACKAGE表中有一个字段channelId,存储的是'B,C,PUB'格式的(多个channelId用逗号隔开),现在已知channelId='B',如何根据'B'查找符合条件的A_RULE......
  • Python 函数
    Python函数一、Python函数之定义函数在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:然后,在缩进块中编写函数体,函数的返回值用return语句返回。1、定义一个函数defmyfirst():print("Helloworld!")myfirst()#输出结果Hellow......
  • 数据库转移到sd卡AsyncTask,ProgressDialog使用
    privateclassExportDatabaseFileTaskextendsAsyncTask<String,Void,Boolean>{privatefinalProgressDialogdialog=newProgressDialog(ctx);//canuseUIthreadhereprotectedvoidonPreExecute(){this.di......