Asyncjs

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)

推荐阅读更多精彩内容

  • 在线阅读 http://interview.poetries.top[http://interview.poetr...
    程序员poetry阅读 110,138评论 24 449
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 809评论 0 1
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,017评论 0 2
  • 五十三:请解释 JavaScript 中 this 是如何工作的。1.方法调用模式当一个函数被保存为一个对象的属性...
    Arno_z阅读 318评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 129,352评论 18 137
  • 亲爱的朋友,大家晚上好。又是一个周三了,我们相约在晚上八点到九点。两周未见,这两周你过得好吗? 今天是我们的第45...
    哈哈兴鸿阅读 80评论 0 0
  • 《蒙学本·始明义》载:苍天之下,地裂七洲,中曰大荒,大荒辽阔而南北不同冬夏,余六渺若星辰而环视,六洲皆有一陆桥与大...
    皮皮白花菜阅读 263评论 0 2
  • 《《《 “我的男友得了乳腺癌!” 当霉霉梨花带雨地向我述说这件事的时候, 我的嘴巴简直可以吞下一颗梨。 什么?男人...
    司徒叛命阅读 259评论 0 0
  • 前端7班_leec 注释 注释的规则跟C++和其他语言类似,单行注释用//,多行注释通过/*注释内容*/: 声明 ...
    奔跑的Pi阅读 220评论 2 2