作者: admin

  • async/await、Promise执行顺序

    这个有点难懂,需要一些基础知识来支持。

    1,Promise执行的优先级大于setTimeout/setInterval

    2,async 用于申明一个 function 是异步的,所以在该function里面的程序都是异步的,但有时也需要依赖某个函数执行完成得到结果才能继续执行 ,这时候可以在函数体里面使用await

    3,await 只能出现在 async 函数中

    4,await后面可以接着一个直接变量或者是一个promise对象

    5,await后面接着是promise对象,async函数体内就会阻塞要等await后面的promise函数执行完成才会继续往下走。async函数体外的代码可不会去一
    直等待。

    6,如果在函数中 return 一个直接量,async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象。

    7,在没有 await 的情况下执行 async 函数,它会立即执行,返回一个 Promise 对象,并且,绝不会阻塞后面的语句。这和直接new Promise对象效
    果一样。

     

    简单案例:

    setTimeout(function (){
       console.log('定时器开始啦' )
    });
    
    new Promise (function (resolve){
      console.log('马上执行for循环啦');
      for ( var i = 0 ; i < 10000 ; i++){
        i == 99 && resolve();
      }
    }). then (function(){
      console.log( '执行then函数啦')
    });
    
    console.log('代码执行结束');
    
    
    结果:
    马上执行for循环啦
    代码执行结束
    执行then函数啦
    定时器开始啦
    
    

    解释:

    js主线程走到setTimeout时,先把setTimeout函数扔进setTimeout队列中暂时不执行里面代码,然后js主线程代码又走到new Promise对象立马执行里面的代码,输出“马上执行for循环啦”,由于new Promise对象返回的是 Promise对象所以要扔进Promise队列中,接着js主线程接着往下走,输出“代码执行结束”,下面已经没代码可以执行了,js主线程返回查看是否有Promise队列,发现有于是执行了“执行then函数啦”,剩下已无代码可执行就把剩下的setTimeout队列里面的代码执行了输出“定时器开始啦”

     

     

     

    直接案例:

    function testSometing() {
      console.log("执行testSometing");
      return "testSometing";
    }
    
    async function testAsync() {
      console.log("执行testAsync");
      return Promise.resolve("hello async");
    }
    
    async function test() {
      console.log("test start...");
      const v1 = await testSometing();//关键点1
      console.log(v1);
      const v2 = await testAsync();
      console.log(v2);
      console.log(v1, v2);
    }
    
    test();
    
    var promise = new Promise((resolve)=> { console.log("promise start.."); resolve("promise");});//关键点2
    promise.then((val)=> console.log(val));
    
    console.log("test end...")
    
    以下是执行结果:
    test start...
    执行testSometing
    promise start..
    test end...
    testSometing
    执行testAsync
    promise
    hello async
    testSometing hello async

     

    下面开始解释:

    js主线程先是执行test()函数被调用了,执行了“test start…”,接着执行了testSometing()函数输出了“执行testSometing”,由于遇到了await,主线程跳出了test函数体外,代码接着往下走,遇到并执行了new Promise对象,输出了“promise start..”,并把new Promise对象推入到Promise队列中。代码接着往下走,遇到了“test end…”。这时候js主线程走完,开始把未执行的支线程放入到主线程中继续执行,于是就继续返回到原来跳出的test函数中那地方继续跑代码,执行到console.log(v1)输出“testSometing”,接着走到并执行testAsync函数输出“执行testAsync”,由于遇到了await,主线程再次跳出了test函数体外,代码接着往下走,发现已经没什么代码可以运行了,就把剩下的new Promise对象的then回调执行了,输出“promise”,接着回test()函数体内,由于testAsync()是new Promise对象,还要再跳出test函数,继续往下走依然没任何代码可以执行了。返回test函数体内,执行testAsync()的返回的值,console.log(v2)输出“hello async”,后面输出“testSometing hello async”。

     

    重点注意:
    1,在async函数中,遇到await后面接着是普通函数时,先把普通函数里面的代码执行了后,就会跳出async函数体外,代码接着往下跑,直到跑完
    了后在重新回到await刚刚跳出的位置,继续跑async函数体内的代码。

    2,在async函数中,遇到await后面接着也是async函数时也就是Promise对象,也会先执行await紧接的函数代码,之后跳出async函数体外,代码
    接着往下跑,直到跑完了后在重新回到await刚刚跳出的位置,由于await后面接着是Promise对象,再次跳出async函数体外。继续跑下面的代码。
    直到跑完后才再次返回到await代码处。

     

     

    在来一个案例,这次加入setTimeout

    async function async1() {
       console.log( 'async1 start' )
       await async2()
       console.log( 'async1 end' )
    }
    
    async function async2() {
       console.log( 'async2' )
    }
    
    console.log( 'script start' )
    
    setTimeout( function () {
      console.log( 'setTimeout' )
    }, 0 )
    
    async1();
    
    new Promise( function ( resolve ) {
       console.log( 'promise1' )
    resolve();
    } ).then( function () {
       console.log( 'promise2' )
    } )
    
    console.log( 'script end' )

     

     

    结果:

    script start
    async1 start
    async2
    promise1
    script end
    promise2
    async1 end
    setTimeout

     

    过程:

    js主线程走到并输出“script start”,由于setTimeout执行的优先级低于主线程上的任务和Promise上的任务所以要等到最后,直到执行
    async1()函数内,输出“async1 start”,在执行async2()函数输出“async2”,由于走到async2()函数时遇到await,要跳出async1()函
    数体外,接着代码往下跑,执行new Promise对象,输出“promise1”,new Promise对象进入到Promise队列中,继续往下走,输
    出“script end”,现在回到async1()函数体内中的await async2()处,由于await后面接着async2()返回的是Promise对象还要再次跳出
    async1()函数体外继续执行以外的代码,这时候正好有Promise队列中的then需要执行,于是输出“promise2”,剩下没代码可以跑了,
    setTimeout仍然靠后优先级低,再次回到async1()函数体内,接着执行输出“async1 end”,最后剩下主线程和Promise队列的任务都执行
    完成了,就输出“setTimeout”

     

     

     

     

  • centos 6.x脚本在某时间自动执行——cron

    快速使用:

    # 1. 编辑定时任务
    crontab -e
    
    # 2. 添加一个任务(每天凌晨2点备份)
    0 2 * * * /home/user/backup.sh
    
    # 3. 保存退出后,cron 守护进程会自动加载新配置
    
    # 4. 查看任务是否添加成功
    crontab -l

     

     

    centos linux 脚本 自动执行 脚本 自动 定时 自动 执行

    在linux系统,希望某时间段自动执行一些脚本。可以操作如下:

    1,安装

    yum install crontabs

    cron是执行文件,crontab是配置文件

     

    2,安装完成后,会有如下文件

    使用者权限文件:

    文件:/etc/cron.deny

    说明:该文件中所列用户不允许使用crontab命令

     

    文件:/etc/cron.allow

    说明:该文件中所列用户允许使用crontab命令

     

    文件:/var/spool/cron/

    说明:所有用户crontab文件存放的目录,以用户名命名

     

    我们一般要编辑的是:/etc/crontab    (查看文件看看自己添加了那些命令)

    案例:

    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    HOME=/
    
    # For details see man 4 crontabs
    
    # Example of job definition:
    # .---------------- minute (0 - 59)
    # | .------------- hour (0 - 23)
    # | | .---------- day of month (1 - 31)
    # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
    # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # | | | | |
    # * * * * * user-name command to be executed
    45 4 1 * * /etc/init.d/mysqld restart     //这里就是我加的,每月1号的4点45分执行/etc/init.d/mysqld restart

    不明白那些参数对照着下面的图就会明白了

    45 4 1 * * /etc/init.d/mysqld restart   //每月1号的4点45分执行/etc/init.d/mysqld restart
    --------------------
    1.每晚的21:30重启nginx:30 21 * * * /etc/init.d/nginx restart
    2.每月1、 10、22日的4 : 45重启nginx:45 4 1,10,22 * * /etc/init.d/nginx restart
    3.每一小时重启nginx:* */1 * * * /etc/init.d/nginx restart
    4.晚上11点到早上7点之间,每 隔一小时重启nginx:* 23-7/1 * * * /etc/init.d/nginx restart
    --------------------- 
    
    实例1:每1分钟执行一次command
    
    命令:
    
    * * * * * command
    
    实例2:每小时的第3和第15分钟执行
    
    命令:
    
    3,15 * * * * command
    
    实例3:在上午8点到11点的第3和第15分钟执行
    
    命令:
    
    3,15 8-11 * * * command
    
    实例4:每隔两天的上午8点到11点的第3和第15分钟执行
    
    命令:
    
    3,15 8-11 */2 * * command
    
    实例5:每个星期一的上午8点到11点的第3和第15分钟执行
    
    命令:
    
    3,15 8-11 * * 1 command
    
    实例6:每晚的21:30重启smb 
    
    命令:
    
    30 21 * * * /etc/init.d/smb restart
    
    实例7:每月1、10、22日的4 : 45重启smb 
    
    命令:
    
    45 4 1,10,22 * * /etc/init.d/smb restart
    
    实例8:每周六、周日的1 : 10重启smb
    
    命令:
    
    10 1 * * 6,0 /etc/init.d/smb restart
    
    实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb 
    
    命令:
    
    0,30 18-23 * * * /etc/init.d/smb restart
    
    实例10:每星期六的晚上11 : 00 pm重启smb 
    
    命令:
    
    0 23 * * 6 /etc/init.d/smb restart
    
    实例11:每一小时重启smb 
    
    命令:
    
    * */1 * * * /etc/init.d/smb restart
    
    实例12:晚上11点到早上7点之间,每隔一小时重启smb 
    
    命令:
    
    * 23-7/1 * * * /etc/init.d/smb restart
    
    实例13:每月的4号与每周一到周三的11点重启smb 
    
    命令:
    
    0 11 4 * mon-wed /etc/init.d/smb restart
    
    实例14:一月一号的4点重启smb 
    
    命令:
    
    0 4 1 jan * /etc/init.d/smb restart
    
    实例15:每小时执行/etc/cron.hourly目录内的脚本
    
    命令:
    
    01   *   *   *   *     root run-parts /etc/cron.hourly

     

     

     

    3,启动、重启、停止

    查看crond服务状态:service crond status
    启动crond服务:service crond start
    停止crond服务:service crond stop
    修改了配置,重新载入配置:service crond reload
    查看crond服务是否已设置为开机启动,执行命令:ntsysv
    加入开机自动启动:chkconfig --level 35 crond on

     

     

    4,执行自定义脚本

    案例:mysql备份脚本

    #!/bin/sh
    
    DB_USER=root
    DB_PASS=****
    DB_NAME=xxx
    DB_BKPATH="/usr/local/backup"
    DATE=`date +%Y%m%d%H%M`
    HOUR_AGO=`date +%Y%m%d%H -d "-1 hour" `
    
    cd ${DB_BKPATH}
    mysqldump --opt -u${DB_USER} -p${DB_PASS} ${DB_NAME} > ${DB_BKPATH}/${DB_NAME}_${DATE}.sql
    rm -rf ${DB_BKPATH}/${DB_NAME}_${HOUR_AGO}*

    要定时执行使用crontab -e来添加定时备份数据库,目前为每6个小时备份一次,具体命令为:

    输入crontab -e命令,进入vim编辑模式直接加入以下命令,保存退出即可。
    * */6 * * * sh /usr/local/backup/mysql_backup.sh

     

     

    参考:

    http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html

    https://blog.csdn.net/chen_jianjian/article/details/48706465

     

  • 解决:阿里云vps的mysql自动关机问题。

    my.cnf笔记 mysql 错误日志

    最近在阿里云买的vps  mysql数据库服务自动关闭。

     

    首先要查看错误日志:

    方法1:到查看mysql的安装目录,进入data目录下查看类似error的错误日志 mysql-error.log

    方法2:进入数据库,查看是否启动日志错误

    show variables like 'log_%'   //on为启动
    show variables like '%error%';

    具体查看:https://blog.csdn.net/dreamcs/article/details/53502625

     

     

    根据错误定位关键词:

    InnoDB: mmap(137363456 bytes) failed; errno 12

     

    这个其实日志里面说的很明白就是 mysql要占用内存的时候 物理内存不够用导致的。

     

    1,先查看mysql优先使用哪个目录下的my.cnf

    mysql --help|grep 'my.cnf'
    /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

    排前面的最优先加载被使用。

     

    2,编辑修改my.cnf

    innodb_buffer_pool_size=64MB 改成64mb

     

    3,重启mysql

     

    参考:

    https://www.cnblogs.com/zsmynl/p/3602319.html

    http://hongjiang.info/aliyun-vps-mysql-aborting/

     

  • jquery图片灯箱相册鼠标滑轮放大效果。

    jquery 灯箱 图片 相册 鼠标滑轮 图片放大

    效果:地址

    jiaoben5865

     

  • select默认颜色和选中颜色的修改

    select 颜色 修改  设置

     

    效果就是,默认显示一种颜色选中后又是另一个种颜色。

     

     

    方法一:

        var unSelected = "#999";
        var selected = "#333";
        $(function () {
            $("select").css("color", unSelected);
            $("option").css("color", selected);
            $("select").change(function () {
                var selItem = $(this).val();
                if (selItem == $(this).find('option:first').val()) {
                    $(this).css("color", unSelected);
                } else {
                    $(this).css("color", selected);
                }
            });
        })

     

     

    方法二:推荐


    <select style="color: #D3D6DA">
    <option selected value="">请输入真实姓名</option>
    <option value="123">456</option>
    <option value="456">456</option>
    </select>


    $("select").on('change',function(){
    if($(this).val() !== "" ) {
    $(this).css({color: '#454545'}); //选中后颜色
    } else {
    $(this).css({color: '#D3D6DA'}); //默认颜色
    }
    });