javaScript异步编程
笔记
Recommand:
- CodeSchool JQuery
- MDN for Question
- Stack Overflow
代码样式
- 缩进为
2
空格 - 驼峰式命名
- 末尾使用分号,除函数定义
- 当且仅当调用链中的两个函数调用返回同一对象时才使用相同缩进
$('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. (/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;
});
未捕获异常的处理
若异常从未被捕获
- 在浏览器环境中
- 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)