javascript 手写promise 发布订阅简单实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript 手写promise 发布订阅简单实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2830字,纯文字阅读大概需要5分钟。
内容图文
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 平方米房子的价格
内容总结
以上是互联网集市为您收集整理的javascript 手写promise 发布订阅简单实现全部内容,希望文章能够帮你解决javascript 手写promise 发布订阅简单实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。