js整理4

异步处理

错误处理

  • 同步
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多了一项特性:可以直接触发;resolvereject方法均可以触发Deferred对象;
原文地址:https://www.cnblogs.com/jinkspeng/p/5079925.html