精华内容
下载资源
问答
  • 本文为大家讲解下js异步操作时回调函数如何控制执行顺序,感兴趣的朋友可以参考下
  • 我们都知道同步API可以从返回值中拿到API执行的结果, 但是异步API却是不可以的 // 同步 function sum (n1, n2) { return n1 + n2; } const result = sum (10, 20);//30 // 异步 function getMsg () { ...

    获取返回值

    我们都知道同步API可以从返回值中拿到API执行的结果, 但是异步API却是不可以的

     // 同步
      function sum (n1, n2) { 
          return n1 + n2;
      } 
      const result = sum (10, 20);//30
    
    // 异步
      function getMsg () { 
          setTimeout(function () { 
              return { msg: 'Hello Node.js' }
          }, 2000);
      }
      const msg = getMsg ();
      console.log(msg);//undefined
    

    为什么会是undefined?
    我们知道JavaScript的代码执行机制,会将异步代码放入任务队列中,而继续执行下面的同步代码,而造成undefined的原因正是异步函数还没有被触发,所以当调用getMsg ()函数时其中异步函数不阻塞线程,代码继续执行,getMsg ()函数默认return了一个undefined

    所以这就造成了异步代码的不可控,我们根本不知道他什么时候执行,也就无法直接获取它的执行结果

    那有办法解决么?
    当然

    回调函数获取异步API返回值

    我们可以定义一个这样的函数:

    function getData(callback) {
        callback(123);
    }
    getData(function(n) {
       console.log(n)//输出123
    });
    

    这就是回调函数

    通过在函数形参中拿到的回调函数引用地址,可以调用回调函数并传递参数给回调函数的形参,这样回调函数就可以获得被调用函数中的信息

    所以我们刚刚的代码可以写成这样

    function getMsg (callback) {
    	setTimeout(function () {
    		callback({
    			msg: 'hello node.js'
    		})
    	}, 2000)
    }
    
    getMsg(function (data) {
    	console.log(data);
    });
    

    异步代码执行顺序

    异步代码除了返回值还有一个执行顺序问题

    console.log('代码开始执行');
    setTimeout(() => {
        console.log('2秒后执行的代码');
    }, 2000); 
    setTimeout(() => {
        console.log('"0秒"后执行的代码');
    }, 0);
    console.log('代码结束执行');
    

    上面的代码输出结果是什么呢?

    我们知道JavaScript的代码执行机制,来分析一下:
    很明显在执行栈中遇到异步代码,就会将其放到异步代码执行区,这时两个定时器都被放到异步代码执行区中了,然后在异步代码执行区中先触发的异步代码会先一步被放入任务队列中,等待调用

    显然输出结果是先输出“0秒"后执行的代码”,然后再输出’2秒后执行的代码’

    这样不可控制的输出顺序显然不是我们期望的,那么该如何解决呢?

    回调函数控制异步代码执行顺序

    function getData(callback) {
        setTimeout(() => {
            callback(123);
        }, 0);
    }
    
    console.log('代码开始执行');
    getData(function(n) {
        console.log('callback函数被调用了')
        console.log(n)
        console.log('callback函数结束了')
    });
    console.log('代码结束执行');
    //代码开始执行
    //代码结束执行
    //callback函数被调用了
    //123
    //callback函数结束了
    

    我们看到在回调函数中代码是依次进行的

    回调函数的作用就是,将异步代码写在一个块级作用域中,当其中的异步函数执行后,才会调用这个回调函数,这时异步函数已经执行完成,所以在回调函数中代码就可以如同步代码一样依次执行

    所以问题就解决了,只需要在回调函数中调用其他的异步API就可以保证异步代码的顺序执行

    function getData(callback) {
        setTimeout(function() {
            console.log('2s')
            setTimeout(function() {
                console.log('0s')
                callback(123);
            }, 0)
        }, 2000)
    
    
    }
    
    console.log('代码开始执行');
    getData(function(n) {
        console.log(n)
    });
    console.log('代码结束执行');
    //代码开始执行
    //代码结束执行
    //2s
    //0s
    //123
    
    展开全文
  • javascript利用回调函数解决异步困扰

    千次阅读 2016-08-21 15:00:53
    但是讲真,我觉得他们也并没有让代码的可读性大大增强,而且在回调函数的嵌套次数有限的情况下也不至于成为一个“地狱”,所以笔者还是老老实实的继续啃这块js里的板砖——利用回调函数解决javascript异步困扰。...

    虽然已经存在promise,StratifiedJS等工具用来解决回调地狱,但是讲真,我觉得他们也并没有让代码的可读性大大增强,而且在回调函数的嵌套次数有限的情况下也不至于成为一个“地狱”,所以笔者还是老老实实的继续啃这块js里的板砖——利用回调函数解决javascript异步困扰。


    但愿大家可以从下面的这个例子得到些有用的信息:

    fun(function(data){ //data:num1
     fun1(num1,function(data){ //data:num2
      fun2(num2,function(data){ //data:num3
        fun3(num3);
      });
     });
    });
    
    
    function fun(callback)
    {
      var num1 = 1;
      console.log("begins!");
      callback(num1);
    }
    function fun1(num1,callback)
    {
      var num2 = 2;
      setTimeout(function(){
        console.log(num1);
        callback(num2);
      },3000);
    }
    function fun2(num2,callback)
    {
      var num3 = 3;
      setTimeout(function(){
        console.log(num2);
        callback(num3);
      },2000);
    }
    function fun3(num3)
    {
      setTimeout(function(){
        console.log(num3);
      },1000);
    }

    输出结果如下图所示:


    可以看出函数的执行顺序为fun1---->fun2---->fun3,是按照我们回调函数嵌套,由外层向内层执行,达到了某种意义上的顺序执行。





    展开全文
  • 定义:回调函数被认为是一种高级函数,一...回调函数的本质是一种模式(一种解决常见问题的模式),因此回调函数也被称为回调模式。 答案:一毛钱的关系都没有。 那为啥,很多很多的异步操作都有回调函数啊??? ...

    定义:回调函数被认为是一种高级函数,一种被作为参数传递给另一个函数的高级函数。回调函数的本质是一种模式(一种解决常见问题的模式),因此回调函数也被称为回调模式。 

    简而言之:一个函数在另一个函数中被调用。而且可以当参数传给其他函数。

    答案:一毛钱的关系都没有。

    那为啥,很多很多的异步操作都有回调函数啊???

    ok,那我问你,你那些异步操作,是回调的作用么?

    不是吧。

    简单理解:callback 顾名思义  打电话回来的意思

    举例:

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

    再比如,你发送一个axios 请求,请求成功之后,触发成功的回调函数,请求失败触发失败的回调函数。这里面的回调函数更像是一个工具,后台通过这个工具告诉你,你成功了抑或是失败了。

    这里面的所有异步操作都和回调没关系,真正的异步是then方法。

     

    展开全文
  • 今天正好公司停电,放假一天,准备听课封装一下用nodejs操作 MongoDB数据库的方法来着, 然后我就掉坑里了 记录一下吧 ...首先说一下环境,我用的是...然后,我这个问题现在还没解决,求大神解救; 跪谢 ! ! !

    今天正好公司停电,放假一天,准备听课封装一下用nodejs操作 MongoDB数据库的方法来着,

    然后我就掉坑里了

    记录一下吧

    首先说一下环境,我用的是nodejs 操作MongoDB数据库用的包是mongodb

    第一步,按部就班的写一下,找到数据库和集合,准备操作;

    // 加载mongodb包
    var mongodb = require("mongodb");
    
    // 连接客户端
    var mongoClient = mongodb.MongoClient;
    
    // 准备地址
    var url = "mongodb://127.0.0.1:27017";
    
    // 连接客户端
    mongoClient.connect(url, function (err, client) {
    
        // 检测错误
        if (err) {
            console.log("** 数据库连接失败 **");
        } else {
            console.log("** 数据库连接成功 **");
    
            // 操作
            var db = client.db("db1811");               // 数据库
            var collection = db.collection("person");   // 集合
    
            // 增删改查操作
    
            client.close();  // 关闭连接
        }
    })

    二、我将查询数据的方法,抽取出来了

    方法说明:

    参数1 是集合对象,也就是要查询的集合;

    参数2 是查询的条件对象;

    参数3 是连接到的客户端对象

    我想的是,在调用我这个方法的时候,生成一个对象,然后不管查询的结果如何,都在我这个对象中有所体现

    比如说,我查询失败,对象中就会存储失败的状态码和失败信息,成功的话就会存储成功的状态码和查询到的数据

    如:

    失败 - ret = {state:0 , content:" err信息 "}

    成功 - 有数据 - ret = {state:1 , content : [{.. , ..}] }

            - 无数据 - ret = {state:1 , content : "** 暂无数据 **"}

    然后在外边就可以根据返回的数据进行操作了;

    /**
     * DataFind() 查询数据
     * @param {*} collection    集合对象
     * @param {*} data          查询条件
     * @param {*} client        客户端对象
     * 返回值是一个对象 {state:状态码 0-失败 1-成功,content:"错误原因/查到的数据"} 
     */
    var DataFind = function (collection, data, client) {
        var ret = {};
        collection.find(data).toArray(function (err, result) {
            if (err) {
                ret.statea = 0;
                ret.content = err;
            } else {
                if (result.length > 0) {
                    ret.statea = 1;
                    ret.content = result;
                } else {
                    ret.statea = 1;
                    ret.content = "** 暂无数据 **";
                }
            }
            client.close();
        });
        return ret;
    }
    

    使用如下:

    打印出的结果如下:

    没拿到数据;

    我的分析如下:

    我封装的方法里面用到的这个查询方法是异步执行的,也就是当我执行这个封装方法的时候,执行就直接

    var ret = {};

    return ret;

    中间的代码,暂时没执行,因为同步代码和异步代码在一起的时候,先执行同步代码;

    所以返回出来的是个空的对象,里边查询出来的数据是 undefined

     

    然后,我这个问题现在还没解决,求大神解救;

    跪谢 ! ! !

    展开全文
  • 如果需要获取一个函数中异步操作的结果,则必须通过回调函数来获取 funtion fn (callback) { //var callback = function (data) { console.log(data) } setTimeout(function () { var data = 'hello' callback...
  • js回调函数异步

    2018-11-12 22:40:07
    首先要知道的是,回调和异步不是同一个东西我以前认为js中每个回调函数都是异步处理的,实际上并不是,可以同步回调,也可以异步回调 callback 例子 说到callback,大家都在javascript中遇到以下的例子 $('#id').on...
  • 同步回调函数: 理解:立即执行,完全执行完才结束,不会放到回调队列中 例子:数组遍历相关的函数回调,forEach、Promise的excutor函数 ...异步回调函数: 理解:不会立即执行,会放在回调队列中将.
  • 本文实例讲述了javascript回调函数异步脚本载入方法。分享给大家供大家参考。具体实现方法如下: var Loader = function () { } Loader.prototype = { require: function (scripts, callback) { this....
  • JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。因此callback 不一定...
  • JS中的同步回调函数异步回调函数
  • js中的异步模式--- 回调函数

    千次阅读 2019-06-20 17:17:18
    js中的异步 使用像 JavaScript 这样的语言编程时,很重要但常常被误解的一点是,如何表达和控制持续一段时间的程序行为。 如从数据库或文件系统中请求数据然后显示数据、通过网络发送数据并等待响应,或者是在以...
  • js回调函数获取异步返回值 1.尝试获取异步返回值 function test(){ var res = 0; setTimeout(function(){ res = 1; },1000) return res } function opreation(){ var r = test() console.log(r) //输出结果...
  • 回调函数: 这只是一个称呼,表达的含义是 将函数A作为函数B的参数,并且函数A在函数B内进行调用。 这可以用来解决异步。因为异步的时候我们不能一直等待,因此需要一个函数来在异步操作执行完了以后,继续接下来的...
  • 回调函数、Promise到async/await的同步写法执行异步代码 同步异步是前端面试中经常遇到的问题,虽然不难,但是搞清楚两者之间的关系和转换还是很重要 同步 同步是一种线性执行的方式,执行的流程不能跨越,其后的...
  • Hi,小伙伴们,今天来和大家谈一谈有关javascript 中回调的问题,首先回调函数分为两种 1、同步回调函数(普通的回调函数) 2、异步回调函数   其中同步回调函数是要等到回调函数都执行完成后才能进行接下来的操作,也...
  • 问题1:大家帮我看一看我的这个理解对不对:回调就是函数做参数,回调和同步异步没有直接关系,有异步回调,也有同步回调,同步回调是函数的组织更灵活,异步回调函数仅仅是js异步编程的方式之一。 问题2:关于回调...
  • 异步JavaScript和XML这不是一个全新的技术,而是利用已有的js/css/xml等技术达到前端数据及时更新的效果.对用户而言,前端页面的刷新就是点击页面刷新按钮 或者F5实现页面内容的刷新。甚至有很多人不知道页面刷新这...
  • 本文试图尝试站在初学 异步 编程的角度来解释什么是 回调函数。 同步和异步 在介绍 回调函数 之前,先来看两个概念 同步 和 异步。 同步 行为通常指代码从上到下一行一行的顺序执行,后面的代码总是在前面的代码执行...
  • JS同步异步以及回调函数

    千次阅读 2018-07-04 20:13:10
    异步指的是每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步...
  • 回调函数 同步回调 异步回调

    千次阅读 2019-01-21 15:11:44
    回调函数 回调函数一般是在封装接口的时候,回调显得特别重要,我们首先假设有两个程序员在写代码,A程序员写底层驱动接口,B程序员写上层应用程序,然而此时底层驱动接口A有一个数据d需要传输给B,此时有两种方式...
  • 异步回调函数的意义在于, 你希望你的回调函数的内容是跟在异步代码后面的执行的,而不是早于异步代码执行(他们将在同一时序里)。  同时调用同步回调 和异步回调 看看代码执行的结果你就明白怎么回事了。 ...
  • js是单线程语言,执行任务的情况是根据任务顺序,前一个任务完成之后执行下一个任务。异步改变事件的执行顺序。 举个例子 var f1 = function (){ setTimeout(function () { console.log(1); },1000); ...
  • 如何从JS异步回调函数返回值?

    千次阅读 2020-06-25 07:59:00
    什么是回调? (What are callbacks?) Quite literally, callbacks can be understood as calling something back. In programming, we use a call to imply that we're calling a function, so what's callback? To ...
  • 最近学习node.js涉及到了大量的异步编程,很多地方都需要用到回调函数,所以这两天深入了解了JavaScript回调函数,下面是我对回调函数的理解。 函数也是对象 想要弄明白js回调函数,首先要清楚函数的规则,在...
  • js回调函数 同步 异步

    2017-09-30 16:11:18
    JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。 因此callback 不...
  • 回调函数与同步异步

    2019-08-25 17:09:22
    回调函数异步的。 代码的执行顺序分为:同步 异步 同步 弊端:会发生执行阻塞 异步不会发生阻塞, 异步:未来某一时刻需要执行的代码,优先执行,同步是按照代码的编写顺序从上往下执行,异步不会等待其他代码执行...
  • 今天研究一个小问题: 怎么拿到JavaScript异步函数的返回值? 1.错误尝试 当年未入行时,我的最初尝试: ...2.回调函数 弹出的不是4,而是0,后来知道这是异步的问题, 要用回调技术来做: [removed] func

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 114,567
精华内容 45,826
关键字:

js回调函数解决异步