Asyncjs

作者: 夏大昊 | 来源:发表于2016-10-13 23:31 被阅读0次

    javaScript异步编程

    笔记

    Recommand:

    • CodeSchool JQuery
    • MDN for Question
    • Stack Overflow

    代码样式

    1. 缩进为2 空格
    2. 驼峰式命名
    3. 末尾使用分号,除函数定义
    4. 当且仅当调用链中的两个函数调用返回同一对象时才使用相同缩进
        $('h1)
            .first()
            .addClass('first)
        .end()
            .last()
            .addClass('last')
    

    事件调度

    回调函数(setTimeout...),运行回调时,我们称已触发某事件

        for(var i = 1; i <= 3; i ++){
            setTimeout(function(){console.log(i);}, 0);
        }//outprint 4, 4, 4
        /*
        调用setTimeout时会有延时事件入队列
        而后后面的代码依照顺序运行
        当没有任何代码
        javascript虚拟机查看队列里面有什么东西
        若有如setTimeout函数,则调用此事件处理器处理
        事件处理器返回后,又回到队列
        即触发的每个事件都会位于堆栈轨迹的底部
        */  
    

    我的想法是在一系列的onload啊什么代码依次进行的时候就不断地将事件添加到队列中,当我们的其余代码比如赋值进行完之后,依次看是否队列中当前的这个元素时候被触发,若被触发则调用他的处理器,若没有则一直在队列中

    setTimeout,setInterval为不精确的计时工具 触发频率低 若需要细粒度的计时,可使用process.nextTick\requestAnimationFrame(P9)

    间或异步的函数(有时异步有时不)

    jQuery同名函数($)可用于延迟函数,若DOM早已结束加载,则不存在任何延迟,$回调会立即触发
    这部分没看懂P12


    异步递归和回调存储P14 :(

    异步递归在等待任务完成期间可触发延时的次数是不受限的
    避免异步递归

    异步错误的处理

    function JSONToObject(jsonStr) {
      return JSON.parse(jsonStr);
    }
    var obj = JSONToObject('{');
    /*
    javascript抛出异常若没有被捕获,会提供有用的堆栈轨迹
    在此例中 堆栈轨迹通知我们哪抛出了错误同时最初出错的地方
    undefined:1
    {
    SyntaxError: Unexpected end of input
        at Object.parse (native)
        at JSONToObject (/Users/cz/Desktop/code/EventModel/stacktrace.js:10:15)
        at Object.<anonymous> (/Users/cz/Desktop/code/EventModel/stacktrace.js:12:11)
        at Module._compile (module.js:409:26)
        at Object.Module._extensions..js (module.js:416:10)
        at Module.load (module.js:343:32)
        at Function.Module._load (module.js:300:12)
        at Function.Module.runMain (module.js:441:10)
        at startup (node.js:139:18)
        at node.js:974:3
    */
    

    回调中抛出的错误

    利用try/catch语句块并不能捕获从异步回调中抛出的错误

    特例为该异步函数确实为同步做某些事且容易出错
    eg. Node的fs.watch(file, callback)

    var fs = require('fs');
    fs.readFile('fhgwgdz.txt', function(err, data) {
      if (err) {
        return console.error(err);
      };
      console.log(data.toString('utf8'));
    });
    /*
    Nodejs中的回调几乎接受一个错误作为其首个参数,这样就允许回调自己来决定如何处理这个错误
    */
    

    fs读取一个文件,当读取完了之后队列中没有别的东西,则调用callback然后传入err和data,再根据具体err进行动作,Ajax对成败各定义单独的回调

    $.get('/data', {
        success: successHandler;
        failure: failureHandler;
    });
    

    未捕获异常的处理

    若异常从未被捕获

    1. 在浏览器环境中
    2. Nodejs环境中若有未被捕获的错误则关停,可通过
      定义domain对象的错误处理器,从而throw只是触发了其错误处理器
    var myDomain = require('domain').create();
    myDomain.run(function() {
      setTimeout(function() {
        throw new Error('Listen to me!')
      }, 50);
    });
    myDomain.on('error', function(err) {
      console.log('Error ignored!');
    });
    

    不管在浏览器端还是服务器,全局的异常处理器都应只在调试时使用

    分布式事件

    PubSub模式

    link.onclick = clickHandler

    link.onclick = function() { clickHandler1.apply(this, arguments); clickHandler2.apply(this, arguments); }

    冗长重复->jQuery抽象为bind方法

    $(link) .bind('click', clickHandler1) .bind('click', clickHandler2)

    相关文章

      网友评论

          本文标题:Asyncjs

          本文链接:https://www.haomeiwen.com/subject/qzlgyttx.html