javascript 手写promise 发布订阅简单实现

var fs = require('fs')
var p1 = new Promise((resolve, reject) => {
	fs.readFile('./data/a.txt', 'utf8', function(err, data){
		if(err){
			reject(err)
		} else {
			resolve(data)
		}
	})
})

var p2 = new Promise((resolve, reject) => {
	fs.readFile('./data/b.txt', 'utf8', function(err, data){
		if(err){
			reject(err)
		} else {
			resolve(data)
		}
	})
})


var p3 = new Promise((resolve, reject) => {
	fs.readFile('./data/c.txt', 'utf8', function(err, data){
		if(err){
			reject(err)
		} else {
			resolve(data)
		}
	})
})


p1.then((data) => {
	console.log(data)
	return p2
             	}, (err) => {
		console.log('ʧ°Ü', err)
	}).then((data) => {
	console.log(data)
	return p3
	}, (err) => {
		console.log(err)
	}).then((data) => {
	console.log(data)	
	}, (err) => {
		console.log(err)
	})
	





// 主线程 -- 任务队列 -- 异步任务






//通用实现
var event = {
  clientList: [],
  listen: function(key, fn) {
    if (!this.clientList[key]) {
      this.clientList[key] = [];
    }
    this.clientList[key].push(fn); // 订阅的消息添加进缓存列表
  },
  trigger: function() {
    var key = Array.prototype.shift.call(arguments), // (1);
      fns = this.clientList[key];
    if (!fns || fns.length === 0) { // 如果没有绑定对应的消息
      return false;
    }
    for (var i = 0, fn; fn = fns[i++];) {
      fn.apply(this, arguments); // (2) // arguments 是 trigger 时带上的参数
    }
  },
  remove: function(key, fn) {
    var fns = this.clientList[key];

    if (!fns) { // 如果 key 对应的消息没有被人订阅,则直接返回
      return false;
    }
    if (!fn) { // 如果没有传入具体的回调函数,表示需要取消 key 对应消息的所有订阅
      fns && (fns.length = 0);
    } else {
      for (var l = fns.length - 1; l >= 0; l--) { // 反向遍历订阅的回调函数列表
        var _fn = fns[l];
        if (_fn === fn) {
          fns.splice(l, 1); // 删除订阅者的回调函数
        }
      }
    }
  }
};

//DOM事件
document.body.addEventListener('click', function() {
  console.log(2);
}, false);

document.body.click(); // 模拟用户点击

//自定义事件
var salesOffices = {}; // 定义售楼处
salesOffices.clientList = {}; // 缓存列表,存放订阅者的回调函数
salesOffices.listen = function(key, fn) {
  if (!this.clientList[key]) { // 如果还没有订阅过此类消息,给该类消息创建一个缓存列表
    this.clientList[key] = [];
  }
  this.clientList[key].push(fn); // 订阅的消息添加进消息缓存列表
};
salesOffices.trigger = function() { // 发布消息
  var key = Array.prototype.shift.call(arguments), // 取出消息类型
    fns = this.clientList[key]; // 取出该消息对应的回调函数集合
  if (!fns || fns.length === 0) { // 如果没有订阅该消息,则返回
    return false;
  }
  for (var i = 0, fn; fn = fns[i++];) {
    fn.apply(this, arguments); // (2) // arguments 是发布消息时附送的参数
  }
};
salesOffices.listen('squareMeter88', function(price) { // 小明订阅 88 平方米房子的消息
  console.log('价格= ' + price); // 输出: 2000000 
});
salesOffices.listen('squareMeter110', function(price) { // 小红订阅 110 平方米房子的消息
  console.log('价格= ' + price); // 输出: 3000000
});
salesOffices.trigger('squareMeter88', 2000000); // 发布 88 平方米房子的价格
salesOffices.trigger('squareMeter110', 3000000); // 发布 110 平方米房子的价格

 

相关文章

最后的控制台返回空数组.控制台在ids.map函数完成之前运行va...
我正在尝试将rxJava与我已经知道的内容联系起来,特别是来自J...
config.jsconstconfig={base_url_api:"https://douban....
我正在阅读MDN中的javascript,并且遇到了这个谈论承诺并且不...
config.jsconstconfig={base_url_api:"https://douban....
这是我的代码main.cpp:#include<string>#include<...