Asyncjs

2016-10-13  本文已影响0人  夏大昊

javaScript异步编程

笔记

Recommand:

代码样式

  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)

上一篇下一篇

猜你喜欢

热点阅读