zoukankan      html  css  js  c++  java
  • 摒弃同步

    JS回调函数中无法改变外部变量的问题 - CSDN博客 https://blog.csdn.net/qq_23870025/article/details/77920898

    今天又遇到了上次的问题,上次只是找了个方法解决,没有搞清楚原理;

    router.get('/', function (req, res, next) {
    
        var abc;
    
        Article.findArticle({}, function (err, res) {
            if (err) {
                console.log(err);
            } else {
                //操作查询出的文章
                abc = res;
            }
        });
    
        console.log(abc);//undefined
    
        res.render('blog/blog', {
            title:'BLOG',
            article:JSON.stringify(abc)
        });
    });

    在express中,查询数据库中的数据,后通过回调函数传递给全局变量,从而渲染到EJS模板,按以上写法是无法将res赋值给abc的,或者说,赋值给了abc,但是对abc的操作是在赋值之前的。 
    一开始我以为是变量的定义问题,后来发现,全都定义为全局变量也不行; 
    然后我突然发现,这其实是回调函数异步执行的问题; 
    看以下代码:

    window.onload = function(){
            function fn1(callback) {
                setTimeout(function(){
                    console.log(1);
                },100);
                callback();
            };
    
            function fn2() {
                console.log(2);
            }
    
            fn1(fn2);
            fn2();
        }

    结果是221 
    console.log(1)在100毫秒后执行,他后面的代码都执行完了,他才会执行,在这里,延时100毫秒,就相当于查询数据库所需要的时间,数据还未查询到,abc=res就无法执行,当这句代码执行时,后面的操作已经执行完了,但是我们已经看不到了; 
    因为在整个代码执行流中,JS的异步机制,决定了他无法等待上一步的执行结果,如果时间稍长(比如需要查询数据库),就只能以一个异步的执行流去写代码。

    要注意摒弃同步的思想。

  • 相关阅读:
    Codeforces Round #741 (Div. 2)部分题题解
    Wedding DJ题解 (回归OI)
    Note -「模板」FHQ-Treap
    Solution -「数论」「校内题」矩阵求和
    【游记】WC2021抱铃记
    洛谷 P7073 /AcWing 2769. 表达式
    洛谷 P3004 [USACO10DEC]Treasure Chest S/CSES 1097
    P7074 [CSP-J2020] 方格取数
    Unity Built-in转URP速查表
    英国学生签证准备材料+办理流程等
  • 原文地址:https://www.cnblogs.com/rsapaper/p/9580280.html
Copyright © 2011-2022 走看看