异步处理
错误处理
function A() {
B();
}
function B() {
C();
}
function C() {
throw new Error('something happend')
};
A();
//错误从内向外抛出
Error: something happend
at C ...
at B ...
at A ...
setTimeout(function A() {
setTimeout(function B() {
setTimeout(function C() {
throw new Error('something happend')
}, 0);
}, 0);
}, 0);
//这3个函授都是从事件队列直接运行;运行C时,A和B并不在内存堆栈里;
Error: something happend
at C ...
未捕获异常处理
window.onerror = function (err) {
return true; //彻底忽略所有错误;
}
process.on('uncaughtException', function (err){
console.log(err); //避免了全部奔溃;
});
//或者使用domain
var Domain = require('domain').create();
Domain.run(function () {
.....
});
Domain.on('error', function (err) {
console.log(err);
});
PubSub(发布订阅)模式
var PubSub = {
handlers: {},
on: function (type, handler) {
if(!(type in this.handlers)) {
this.handlers[type] = [];
}
this.handlers[type].push(handler);
return this;
},
emit: function (type) {
var handlerArgs = Array.prototype.slice.call(arguments, 1);
var handlersTypes = this.handlers[type];
for(var i = 0; i < handlersTypes.length; i++) {
handlersTypes[i].apply(this, handlerArgs);
}
return this;
}
};
PubSub
模式可以用来处理异步事件,但其内在与异步没有关系;事件处理器本身并不知道自己在事件队列中还是在应用代码中运行的;
Promise和Deferred
- 纯
Promise
实例只允许添加多个回调,然后由其他东西来触发;
Deferred
就是Promise
的超集,它比Promise
多了一项特性:可以直接触发;resolve
和reject
方法均可以触发Deferred
对象;