精华内容
下载资源
问答
  • 同步异步

    2011-09-18 12:03:00
    程序中 对于同步异步的做法是 如果是同步 给予相同的路径 ,异步则相反 。用state 判断是否办结 。 转载于:https://www.cnblogs.com/liences/archive/2011/09/18/2180267.html...

    程序中 对于同步异步的做法是    如果是同步 给予相同的路径  ,异步则相反 。用state 判断是否办结 。

    转载于:https://www.cnblogs.com/liences/archive/2011/09/18/2180267.html

    展开全文
  • js同步异步理解

    2019-10-24 10:17:22
    1.首先判断JS是同步还是异步,同步就进入主进程,异步就进入event table(事件表) 2.异步任务在event table中注册函数,当满足触发条件后,被推入event queue(事件队列) 3.同步任务进入主线程后一直执行,直到主线程...

    JS的执行机制(一):

    1.首先判断JS是同步还是异步,同步就进入主进程,异步就进入event table(事件表)

    2.异步任务在event table中注册函数,当满足触发条件后,被推入event queue(事件队列)

    3.同步任务进入主线程后一直执行,直到主线程空闲时,才会去event queue中查看是否有可执行的异步任务,如果有就推入主进程中

    释:异步任务执行顺序:同步任务执行结束(主线程空)-->去事件队列查询是否有可执行的异步任务,有,会推入主线程去执行

    eg:

    for (var i=0;i<=5;i++){
    
        setTimeout(()=>{console.log(i)},1000)
    
    }

    执行结果,1秒后输出6个6》》》setTimeout是异步任务,所以不会立即执行,它需要等到所有的同步任务执行完毕,即for循环结束,当i变为6时开始同时执行6个定时器,此时i指向值为6的全局变量,所以打印6,这就是JS执行机制(一)

    setTimeout(function () {
        console.log(1)
    },0);
    new Promise(function executor(resolve) {
        console.log(2);    
        for(var i=0;i<10000;i++){
            i==9999 && resolve();
        }
        console.log(3);
    }).then(function () {
        console.log(4);
    });
    console.log(5);

    执行结果2 3 5 4 1

    释:setTimeout异步任务 --》进Promise,执行2,往下进入for循环,resolve()是一部任务往下执行,3,接下来跳出异步打印5,同步任务结束,进事件队列开始查询异步任务,打印4,1 所以执行结果2 3 5 4 1

    参考该文章理解:https://www.php.cn/js-tutorial-390120.html

     

     

    展开全文
  • 异步解决+异步变同步+异步同步的区别和概念异步和同步的概念异步同步判断函数的同步异步方法异步解决的疑点回调函数promisegeneratorasync+await异步变同步 异步和同步的概念 异步 概念 请求通过事件触发->...

    异步和同步的概念

    异步

    • 概念
      请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕
      发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式
    • 模式
      非阻塞
    • 传输单位
      数据包
    • 举例
      callback、settimeout、ajax、回调函数、promise、then

    同步

    • 概念
      提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
      发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式
    • 模式
      阻塞
    • 传输单位
      字符
    • 举例
      js(js是单线程的,虽然js是单线程的,但是浏览器的内核是多线程的,可以通过event loop将js同步变成异步)

    判断函数的同步异步方法

    • 在结果的前后都加一个console,如果打印的结果在console中间就是同步,结果在console的后面就是异步

    异步解决的疑点

    回调函数

    • 概念
      回调函数就是传递一个参数化的函数,就是将这个函数作为一个参数传到另一个主函数里面,当那一个主函数执行完之后,再执行传进去的作为参数的函数。走这个过程的参数化的函数 就叫做回调函数。换个说法也就是被作为参数传递到另一个函数(主函数)的那个函数就叫做 回调函数
    • 执行回调函数的过程
      1、主函数需要调用回调函数
      2、中间函数登记回调函数
      3、触发回调函数事件
      4、调用回调函数
      5、响应回调事件
    • 理解

    你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。

    • 其他(apply、call)
      apply:apply(this,[参数1,参数2…])
      call:call(ths,参数1,参数2)
    • 代码说明
    <script type="text/javascript">
    		function title(value){//这是回调函数!!!!
    			alert(value);
    		}
    		function main(title, value){//这个主函数:在参数列表中,title作为一个参数传递进来,也就是上文说的 参数化函数;然后value这个值正是title()函数中所需要的。
    			alert("我是主函数");
    			title(value);//结果为:'我是回调函数'。——————然后在这行这个title(),它就是回调函数咯。
    		}
    		main(title,"我是回调函数");//title参数加上()后,就会变回一个函数,并会被执行一次。
    		//PS:看清楚,调用的是main()函数,意味着先执行main(),这时已经执行了主函数,title()被main()在函数体中执行了一次,因此title()是回调函数。
    		
    	</script>
    	
    

    promise

    • 概念
      (是es6新的函数体,核心是用同步的方法产生异步的效果)
      Promise对象的状态有3个,分别是pending(进行中)、fulfilled(已完成)、rejected(已失败)。Promise对象一旦进入了某一个状态,就不会再转成其他状态了(主要是后面两种状态,fulfilled和rejected)。如一旦调用了resolve函数,就是fulfilled的状态,就不会再调用reject函数了。
      1、pending:等待状态,比如正在进行网络请求,或者定时器没有到时间。
      2、fulfilled:满足状态,当我们回调了resolve函数时,就处于该状态。
      3、rejected:拒绝状态,当我们回调了reject函数时,就处于该状态。
    • 代码格式
    promise
      .then(function(data) { 
        // success
      })
      .catch(function(err) {
        // error
      });
    
    • 举例说明
    let p = new Promise((resolve, reject) => {
    	let a1 = '成功的参数';
    	let a2 = '失败的参数';
    	var time = setTimeout(() => {
    		console.log('start');
    		resolve(a1);
    		reject(a2);
    		console.log('end');
    	}, 1000);
    });
     
    p.then(value => {
    	console.log('这是resolve函数体,参数:' + value);
    }, reason => {
    	console.log('这是reject函数体,参数:' + reason);
    })
    
    返回值
    start
    end
    这是resolve函数体,参数是成功的参数
    
    • .then()函数和.catch()函数
      传入的数据永远是函数里面的数据,依赖于promise函数

    generator

    • 概念
      ES6 新引入了 Generator 函数,可以通过 yield 关键字,把函数的执行流挂起,为改变执行流程提供了可能,从而为异步编程提供解决方案。
    • 函数的特征
      – function关键字与函数名之间有一个星号 “*” (推荐紧挨着function关键字)
      – 函数体内使用 yield 表达式,定义不同的内部状态 (可以有多个yield)
      – 直接调用 Generator函数并不会执行,也不会返回运行结果,而是返回一个遍历器对象(Iterator Object)
      – 依次调用遍历器对象的next方法,遍历 Generator函数内部的每一个状态
    • 函数的格式
      // Generator函数
      function* generator() {
        yield 'status one'         // yield 表达式是暂停执行的标记  
        return 'hello world'
      }
    
      let iterator = generator()   // 调用 Generator函数,函数并没有执行,返回的是一个Iterator对象
      iterator.next()              // {value: "status one", done: false},value 表示返回值,done 表示遍历还没有结束
      iterator.next()              // {value: "hello world", done: true},value 表示返回值,done 表示遍历结束
    }
    
    • yield()函数和next()函数
      — 每次遇到 yield,函数就暂停执行,下一次再从该位置继续向后执行;而 return 语句不具备记忆位置的功
      —yield表达式本身没有返回值,或者说总是返回undefined。next方法可以带一个参数,该参数就会被当作上一个yield表达式的返回值

    async+await

    • 概念
      async 函数返回的是一个 Promise 对象。从文档中也可以得到这个信息。async 函数(包含函数语句、函数表达式、Lambda表达式)会返回一个 Promise 对象,如果在函数中 return 一个直接量,async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象。

    async
    作为一个关键字放在函数的前面,表示该函数是一个异步函数,意味着该函数的执行不会阻塞后面代码的执行 异步函数的调用跟普通函数一样

    await
    await即等待,用于等待一个Promise对象。它只能在异步函数 async function中使用,否则会报错
    它的返回值不是Promise对象而是Promise对象处理之后的结果
    await表达式会暂停当前 async function的执行,等待Promise 处理完成。若 Promise 正常处理(fulfilled),其回调的resolve函数参数作为 await 表达式的值,继续执行 async function,若 Promise 处理异常(rejected),await 表达式会把 Promise 的异常原因抛出。​如果 await 操作符后的表达式的值不是一个 Promise,那么该值将被转换为一个已正常处理的 Promise。

    • 举例
    function takeLongTime() {
        return new Promise(resolve => {
            setTimeout(() => resolve("long_time_value"), 1000);
        });
    }
    
    async function test() {
        const v = await takeLongTime();
        console.log(v);
    }
    
    test();
    
    • 返回的非promise
    async function func1(){
        console.log('func1');
    
        var a = await func2(); //当await返回非promise
    
        console.log('func1 return');
    }
    
    function func2(){
    
        console.log('func2');
    
    } //返回undefined
    
    func1();
    
    new Promise(function(resolve){
    
        console.log('promise1');
    
        resolve('resolved');
    
    }).then(function(data){
    
        console.log(data);
    
    });
    
    
    结果
    func1
    
    func2
    
    promise1
    
    func1 return
    
    resolved
    
    • 返回的为promise
    async function func1(){   
    
        console.log('func1');   
    
        var a = await func2(); //当await返回promise   
    
        console.log('func1 return');
    
    }
    
    async function func2(){   
    
        console.log('func2');
    
    } //返回promise
    
    func1();
    
    new Promise(function(resolve){   
    
    console.log('promise1');   
    
    resolve('resolved');
    
    }).then(function(data){   
    
    console.log(data);
    
    });
    
    
    
    结果
    func1
    
    func2
    
    promise1
    
    func1 return
    
    resolved
    
    • 总结
    1. async函数就是generator函数的语法糖。
      async函数,就是将generator函数的*换成async,将yield替换成await。
    2. 返回值是Promise。返回非Promise时,async函数会把它包装成Promise返回。(Promise.resolve(value))
    3. 函数执行时,一旦遇到await就会返回。等到触发的异步操作完成(并且调用栈清空),再接着执行函数体内后面的语句。
    4. await只是让当前async函数内部、后面的代码等待,并不是所有代码都卡在这里。遇到await就先返回,执行async函数之后的代码。
    5. 主线程执行过程中,遇到await后面的函数调用,会直接进入函数,并执行。

    异步变同步

    原代码,希望实现用异步操作实现同步

    
    function delay(ms) {  
      return new Promise((resolve, reject) => {
        setTimeout(resolve, ms);
      });
    }
     
    function* baum() {
      yield delay(300).then(() => console.log(1))
      yield console.log(2)
      yield delay(300).then(() => console.log(3))
      yield console.log(4)
    }
     
    const b = baum()
    b.next()
    b.next()
    b.next()
    b.next()
    
    结果
    2
    4
    1
    3
    

    分析

    先看一下baum()函数每次next()的返回值都是什么

    const b = baum()
    console.log(b.next())
    
    结果
    { value: Promise { <pending> }, done: false }
    1
    

    上面第一行输出中的value值,是delay(300).then(() => console.log(1))这段代码的执行结果,那么我们可知,对于一个promise,它的then()函数的返回值同样是一个promise对象。由此来说,只要将同步的next()执行,放到它前面异步的promise中的then()函数里,即可以达到同步代码发生在异步代码操作之后的效果了。

    改进后的代码

    const b = baum()
    b.next().value.then(() => {
      b.next()
    })
    
    结果
    1
    2
    

    是预期的效果,补全代码即可达到机械的实现效果

    补全代码

    const b = baum()
    b.next().value.then(() => { // 第一个 delay 函数返回的 promise
      b.next()
      b.next().value.then(() => { // 第二个 delay 函数返回的 promise
        b.next()
      })
    })
    
    结果
    1
    2
    3
    4
    

    自动化实现

    使得generator中的调用,无论异步的还是同步的yield操作,都是同步执行

    function himmel(gen) {
      const item = gen.next()
      if (item.done) {
        return item.value
      }
     
      const { value, done } = item
      if (value instanceof Promise) {
        value.then((e) => himmel(gen))
      } else {
        himmel(gen)
      }
    }
    
    测试
    himmel(baum())
    
    结果
    1
    2
    3
    4
    

    函数的实现是一个递归,接收参数是一个generator实例,退出条件即为当yield结果中的done为true的时候。后面的代码会判断value是否是一个promise,如果是的话,就在then()方法中递归,否则就认为是同步代码,直接递归。

    前端大佬太多了@~@

    展开全文
  • Ajax同步异步

    2018-06-28 16:47:50
    问题驱动AJAX的出现: 我们开始对用户输入的用户代码验证的方法是, 等用户填写完注册信息的时候, 再点击注册按钮的时候进行验证判断, 是否已经注册. 这样验证会出现一系列的问题: 1 所有的信息全部填写完后进行...

    问题驱动AJAX的出现:

     

              我们开始对用户输入的用户代码验证的方法是, 等用户填写完注册信息的时候, 再点击注册按钮的时候进行验证判断, 是否已

    经注册. 这样验证会出现一系列的问题:

     

             1  所有的信息全部填写完后进行提交, 会一起把用户填写的信息进行提交, 再验证填写的信息, 如果我们验证的不只是注册时的用

    户代码, 而且要验证邮箱等等选项, 那同时提交给服务器端的时候, 给服务器带来巨大的压力, 需要等待的时间也比较长. 让用户等待,

    就等于浪费用户的时间, 俗话说:Time is Money!

     

             我们不可以把一些需要验证是否存在的信息, 在用户开始输入的时候就进行验证呢? 这样节省了很多时间.  就像制造飞机的工厂一

    样, 为什么要等到整个飞机成形之后再去验证这个必须的零件是否合格呢?  我们可以在制作零件的过程中去验证了. 这样飞机即使有

    问题 ,也不会是零件问题, 会是其他的组装等问题.  

             于是我们想办法去解决这一问题, 随着用户的输入, 随之检验输入的是否合法. 这样也增强了用户体验度.

     

             2  接着上述的问题, 我们是必须要填写完这个选项的信息, 才能填写那个选项的信息吗? 回答是否定的, 这就说到了同步和异步.  

     

            同步, 些许的熟悉, java线程同步问题, 线程同步可能带来的一些列问题, 例如线程的死锁, 还记得那个经典的例子"哲学家进餐问

    题" ,线程同步经典的问题,  是如何解决的? 是wait了?还是sleep了?还是synchronized 了? 同步, 就是做一件事,需要对前一件事进行判

    断, 他们因为某些原因紧密相连, 可能一件事是另一件事的条件, 可能是共同使用一个资源, 但必须排队等候.

     

             异步: 和同步相反, 两件事情是独立的两件事, 没有什么联系, 可以同一时间进行 . 就像制造飞机一样, 制造不同的零件可以同时

    进行. 说说在计算机中, 在这里的异步, 用户提交的信息, 不用最后再去验证, 可以边填写边验证, 这两件事是可以同时进行的.

     

             在用户注册信息时,我们采用的是ajax的异步传输, 很明显, 我们填写前一项信息时不是后一项的必要条件, 所以可以用ajax的异步

    传输来提高效率, 减少用户等待时间, 提高用户体验度.

    展开全文
  • 在服务器端判断request来自Ajax请求(异步)还是传统请求(同步)  在服务器端判断request来自Ajax请求(异步)还是传统请求(同步):    两种请求在请求的Header不同,Ajax 异步请求比传统的同步请求多了一个头...
  • 11.5.2同步异步判断 以一个左循环的阵列为例,如图11.27所示,图中的d0、d1、d2…为阵列中的数据块(注意,这只是阵列中数据块的编号,并不代表数据的先后顺序)。下面我们就来看一看通过对哪些位置的数据顺序...
  • 在jquery中给后台交互时默认是异步调用回调函数,有时需要根据从后台获得的值来判断,就需要同步才行。
  • // 异步 if (Request.Headers["X-Requested-With"] == "XMLHttpRequest") {} // 同步 if (Request.Headers["X-Requested-With"] == null) {}
  • 多个ajax请求的同步异步问题分析

    千次阅读 热门讨论 2018-03-21 10:53:00
    这就不能满足我的需求了,于是了解了一下ajax的同步异步问题,顺利解决了我的疑惑【分析同步、异步】同步:当请求发出后,浏览器什么都不能做,必须得等到请求完成返回数据之后,才执行后续的代码。 生活中例子:...
  • 同步异步,阻塞非阻塞的区别 同步、异步 同步:用户进程发起IO后,进行就绪判断,轮询内核状态。 异步:用户进程发起IO后,可以做其他事情,等待内核通知。 阻塞、非阻塞 阻塞:用户进程访问数据时,如果未完成IO,...
  • 搞了半天后来发现是因为判断是否重复请求时异步的,而实际需要,在同步账户按钮点击之后按顺序先判断是否重复,如果无则进行confirm是否确认同步。 点击事件:触发syncAccountSel()函数,在函数内对选中的信息先...
  • 同步异步详解

    2020-01-10 11:19:03
    同步异步 发送, 接收和回应操作可能是同步或者异步的,一项同步操作阻塞后面的流程知道这个操作结束。 一个异步的操作是非阻塞的,只是初始化操作。 调用者可以通过其他机制来发现操作的完成请款。 同步操作需要...
  • 大家做socket编程时,经常会遇到同步 异步 阻塞 非阻塞这种术语,很混乱,大家的解释也是千奇百怪,下面就说下我的理解。 应该把它们拆分开来,同步异步是一个维度,阻塞与非阻塞是一个维度。 从数据通信角度...
  • 参考: ... 1.JS 执行机制是单线程。 2.JS的Event loop(事件循环)是JS的执行机制, 我们先了解到JS任务的执行分类为:同步任务和...首先,判断JS是同步还是异步同步进入主线程,异步进入Event table。 其次,...
  • 同步异步的区别

    2019-12-13 20:23:17
    (2)判断代码是同步还是异步 (2.1)如果同步,立即执行 (2.2)如果异步,则不执行,会放入事件队列(事件循环 Event Loop) (3)页面所有的同步执行完毕,才开始执行事件队列中的异步代码 2.同步异步区别 a.回调...
  • 在服务器端判断request来自Ajax请求 异步 还是传统请求 同步
  • 注: 根据判断前端的请求是同步还是异步,进行返回对应的数据 ImoccAuthenticationSuccessHandler.java 表示用户登陆成功的授权请求跳转 package com.imooc.security.browser.authentication; import java.io....
  • 判断如下代码在控制台打印顺序 HTML: &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;...
  • 同步:用户进程发起IO(就绪判断)后,轮询内核状态异步:用户进程发起IO后,可以做其他事情,等待内核通知 介绍一下IO模型 网络IO模型和文件IO模型是一样的,上图是IO的5种模型,包括阻塞IO、非阻塞IO、多路...
  • 先说一下几个单词。...同步:用户进程发起IO(就绪判断)后,轮询内核状态 异步:用户进程发起IO后,可以做其他事情,等待内核通知   介绍一下IO模型   网络IO模型和文件IO模型是一样的,上图是IO的
  • 同步调用的相关文档就少一些。一下是同步示例,即页面在加载时,或者这个js被调用到时,程序会一行一行的往下走,这在获取页面初始化需要数据或者... //这里调用的是ext的同步方法,要和异步的调用区别开来 var conn
  • js同步异步

    2019-08-29 16:34:46
    <script>... // 至今为止,我们学习过的知识中,只有事件和setInterval、setTimeout不是同步 其它的代码 比如分支判断 循环语句都是同步 // for (var i = 0; i < 10; i++) { // console.log(i...
  • Ajax中的同步异步

    2019-10-23 17:46:42
    今天遇到一个看似很简单的问题: 用ajax 请求接口,获取接口的一个boolean值, 这个Boolean值要做判断用, 接口没问题, 这个值就是接收不到,报undefined错误,debug之后才发现,是同步异步的问题. Ajax模式是异步的,...
  • 判断最终导入的区域是不是在另一个区域内 1. 工作项目中 也为同一个页面多次用到弹框,因此就为弹框单独写一个方法 popBox(item){ return new Promise(resolve=>{ this.$confirm(.............).then(()=>{...
  • 在Java后台,有时候我们需要根据同步请求和异步请求做个性化...我们可以根据这个东西来判断同步请求还是异步请求。 String isAjax = request.getHeader("x-requested-with"); if (G4Utils.isEmpty(is...
  • 函数或方法掉调用的时候,被调用者是否能得到最终结果来判断同步异步 直接得到最终结果的,就是同步调用不直接得到最终结果的,就是异步调用 同步就是我让你打饭,你不打好我就不走开,直到你打饭给了我异步就是我...
  • 关于http 请求的同步异步调用

    千次阅读 2018-09-12 13:33:46
    这里先说明我个人判断同步请求还是异步请求的依据:所调用的请求(某个url),阻塞了后续代码的执行则为同步,反之则为异步。 同步与异步的概念: 同步、异步常常用来描述一次方法调用过程。 同步:方法一旦调用,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 924
精华内容 369
关键字:

判断同步异步