zoukankan      html  css  js  c++  java
  • JavaScript学习-5——异步同步、回调函数

    ----------异步同步函数

    ----------回调函数

    一、异步同步函数

    同步:发送一个请求,等待返回,然后再发送下一个请求

    异步:发送一个请求,不等待返回,随时可以再发送下一个请求


      同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内            容就会出错,同步就会按顺序来修改。

      异步则是可以提高效率了,现在cpu都是双核,四核,异步处理的话可以同时做多项工作,当然必须保证是可以并发处理的。
      这些都是对的。
      同步和异步最大的区别就在于。一个需要等待一个不需要等待
      比如广播,就是一个异步例子。发起者不关心接收者的状态。不需要等待接收者的返回信息
      电话,就是一个同步例子。发起者需要等待接收者,接通电话后,通信才开始。需要等待接收者的返回信息

    异步代码:

     1     function a(){
     2         console.log("执行a函数");
     3         setTimeout(function(){
     4             console.log("执行a函数的间隔")
     5         },2000)
     6     }
     7     function b(){
     8         console.log("执行b函数");
     9     }
    10    a();
    11    b();

      运行代码时优先执行a函数,并且a的延迟调用前执行b函数,最后执行a的 延迟函数,所以即使,时间设置为0,也是会照样先执行函数b

      => 

    并且:

    调用 setTimeout 函数会在一个时间段过去后在队列中添加一个消息。这个时间段作为函数的第二个参数被传入。如果队列中没有其它消息,消息会被马上处理。但是,如果有其它消息,setTimeout 消息必须等待其它消息处理完。因此第二个参数仅仅表示最少的时间 而非确切的时间,所以即使,时间设置为0,也是会照样先执行函数b.

    同步代码

     1     var a = 0;
     2     function one(){
     3         a=1;
     4         console.log(a);
     5     }
     6     function two(){
     7         console.log(a);
     8     }
     9     one();
    10     two();

      two函数会等one函数完成之后去执行,所以结构输出为1,因为one函数修改了全局变量a的值,one执行之后才执行的two函数;

    二、回调函数

    回来调用,把函数作为参数使用

    回调函数是作为参数传递给另一个函数并在其父函数完成后执行的函数。

    所以回调与同步、异步并没有直接的联系,回调只是一种实现方式,既可以有同步回调,也可以有异步回调,还可以有事件处理回调和延迟函数回调,这些在我们工作中有很多的使用场景

    始终记着callback,只是一个形参名字而已.

    观察下面几个例子

    举例普通函数及调用:

    1     function plus(){
    2         console.log("函数plus被执行");
    3     }
    4     plus();

      输出结果为:

      

      另一种方法:

    1     var num = plus;
    2     num();
    3     function plus(){
    4         console.log("函数plus被执行");
    5     }

      同样输出结果为:

        

    复杂点的例子: operation即为回调,传进来的函数就是回调函数

     1     var num = mathc(10,5,minus);//运算过程就是operation=minus=function(a,b){return a+b;}
     2     console.log(num);
     3     function mathc(a,b,operation){    //operation意思是运算,作为形参
     4             //把10,5,minus传递给mathc函数,其中minus作为一个函数方法
     5         var number = operation(a,b);
     6             //然后把a,b传递给minus函数,以上语句的本质就是 minus(a,b);
     7         return number;
     8     }
     9     //以下为运算方式的函数
    10     function plus(a,b){
    11         return a+b;
    12     }
    13     function minus(a,b){
    14         return a-b;
    15     }

      输出结果为:

      

    看上去很乱,我们来解析一下过程:

    ①首先10,5,minus作为参数传递给函数mathc,而此时minus则是minus函数的整体内容

      输出一下minus为:

        

    ②然后var number = operation(a,b)的语句,就是operation=minus,即为var number = minus(a,b); minus是函数而括号内则代表了形参如果写代码就如下:

    1     var number = function minus(a,b){
    2         return 10-5;
    3     }

     ③最后调用函数mathc

      mathc(10,5,minus)即为:传递了三个参数a,b以及minus函数,而函数的形参就是operation

  • 相关阅读:
    7. Scrapy的高级用法
    6. Scrapy的基本用法
    5. 基于Selenium实现爬虫
    4. 异步爬虫
    3. 数据解析
    2. requests的使用
    1. 爬虫概述
    03-Servlet初识
    Flask框架基础(1)
    登录mysql时,报错ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
  • 原文地址:https://www.cnblogs.com/wannian/p/8618726.html
Copyright © 2011-2022 走看看