您的位置:首页 > Web前端 > JavaScript

js整理4

2015-12-27 13:21 585 查看

异步处理

错误处理

同步

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;  //彻底忽略所有错误;
}


nodejs

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
对象;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: