资讯专栏INFORMATION COLUMN

JavaScript 异步和回调函数

HtmlCssJs / 1306人阅读

摘要:异步找到书前一个任务完成就回电话执行回调函数,而后一个任务找书不管前一个任务是否完成都会开始。回调函数回调函数是实现异步编程的最基本的方法。

JavaScript语言的执行环境是单线程的,即是一次只能完成一个任务,其他任务排队等候执行。只有当前一个任务完成时,才能开始进行下一个任务。

这种模式的执行环境简单,若是遇到一个耗时较长的任务,将会拖延整个程序的执行。

为了解决这个问题,我们有同步和异步两种任务的执行模式:

同步模式即上述所说的单线程模式;
异步模式:每个任务都有回调函数(callback),
前一个任务结束后,不是执行后一个任务,而是执行回调函数,
后一个任务则是不等前一个任务结束就执行,
所以程序的执行顺序与任务的排列顺序是不一致的、异步的。

小剧场:

顾客1(打电话):
    老板,我要买本小黄书,你有吗?
老板:
    我找找,一会儿给你回电话。( 老板干其他事情。)
顾客2(打电话):
    老板,我要买本红包书,你有吗?
老板:
    我找找,一会儿给你回电话。( 老板干其他事情。)
                …………
找到书,老板回电话。

剧场说明

其中回电话就是我们的回调函数,而找书就是任务。
异步:
    找到书(前一个任务完成)就回电话(执行回调函数),
    而后一个任务(找书)不管前一个任务是否完成都会开始。
同步:
    老板接了电话就开始找书(保持通话状态),
    直到书找到满足顾客1的需求,
    顾客2的电话才能打得进来。 

回调函数:
回调函数是实现异步编程的最基本的方法。我们假设有两个函数f1()和f2(),f1()执行完成后才能执行f2():

   f1();
   f2();

假设f1()是一个很耗时的任务,那么我们可以考虑异步机制,改写f1(),将f2改写为f1()的回调函数:

    function f1 (callback) {
    
    setTimeout(function () {
    callback()},1000);
    
    }
    
    f1(f2);
    

采用这种方式,我们把同步操作变成了异步操作,f1不会堵塞程序的运行,也就是说我们先执行程序的主要逻辑,将耗时的操作推迟执行。

欢迎讨论和指出不足^_^

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89792.html

相关文章

  • javascript异步与promise

    摘要:到这里,我已经发出了一个请求买汉堡,启动了一次交易。但是做汉堡需要时间,我不能马上得到这个汉堡,收银员给我一个收据来代替汉堡。到这里,收据就是一个承诺保证我最后能得到汉堡。 同期异步系列文章推荐谈一谈javascript异步javascript异步中的回调javascript异步之Promise.all()、Promise.race()、Promise.finally()javascr...

    rollback 评论0 收藏0
  • 浅析JavaScript异步

    摘要:回调函数,一般在同步情境下是最后执行的,而在异步情境下有可能不执行,因为事件没有被触发或者条件不满足。同步方式请求异步同步请求当请求开始发送时,浏览器事件线程通知主线程,让线程发送数据请求,主线程收到 一直以来都知道JavaScript是一门单线程语言,在笔试过程中不断的遇到一些输出结果的问题,考量的是对异步编程掌握情况。一般被问到异步的时候脑子里第一反应就是Ajax,setTimse...

    Tangpj 评论0 收藏0
  • javascript异步中的回调

    摘要:如果你把函数的指针地址作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 同期异步系列文章推荐谈一谈javascript异步javascript异步与promisejavascript异步之Promise.all()、Promise.ra...

    WalkerXu 评论0 收藏0
  • 异步

    摘要:在异步机制中,任务队列就是用来维护异步任务回调函数的队列。四对象对象是工作组提出的一种规范,目的是为异步编程提供统一接口。 异步 1.JavaScript单线程的理解 Javascript语言的执行环境是单线程(single thread)。所谓单线程,就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。 2.JavaScript单线...

    goji 评论0 收藏0
  • JS 异步的实现

    摘要:由于引擎同一时间只执行一段代码这是由单线程的性质决定的,所以每个代码块阻塞了其它异步事件的进行。这意味着浏览器将等待着一个新的异步事件发生。异步的任务执行的顺序是不固定的,主要看返回的速度。 我们经常说JS是单线程的,比如node.js研讨会上大家都说JS的特色之一是单线程的,这样使JS更简单明了,可是大家真的理解所谓JS的单线程机制吗?单线程时,基于事件的异步机制又该当如何,这些知识...

    sihai 评论0 收藏0
  • 夯实基础-JavaScript异步编程

    摘要:调用栈被清空,消息队列中并无任务,线程停止,事件循环结束。不确定的时间点请求返回,将设定好的回调函数放入消息队列。调用栈执行完毕执行消息队列任务。请求并发回调函数执行顺序无法确定。 异步编程 JavaScript中异步编程问题可以说是基础中的重点,也是比较难理解的地方。首先要弄懂的是什么叫异步? 我们的代码在执行的时候是从上到下按顺序执行,一段代码执行了之后才会执行下一段代码,这种方式...

    shadowbook 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<