首页 > 代码库 > 设计模式(等待者模式)
设计模式(等待者模式)
最近,闲来会看看《javascript设计模式》这本书,空闲时间我会把看到的写出来,和大家一起分享今天先来一个等待者模式。
等待者模式:通过对异步进程监听,来触发未来发生的动作
举例子:异步进程A,B,需要两个进程都完成以后才能进行C进程操作,这时可以使用等待者模式。
平时在开发中经常会这样,需要等到上个程序完成或者知道上个程序完成才去触发下个程序,这时就可以等待者模式。说的不是很清楚咱们看代码:
代码详情
1 var Waiter = function() { 2 var dfd = [], //等待对象容器 3 doneArr = [], //成功回调容器 4 failArr = [], //失败回调容器 5 slice = Array.prototype.slice, 6 that = this; 7 //监控对象类 8 var Promise = function() { 9 //监控对象是否解决成功状态10 this.resolved = false;11 //监控对象是否解决失败状态12 this.rejected = false;13 }14 Promise.prototype = {15 //解决成功16 resolve: function() {17 //设置当前监控状态是成功18 this.resolved = true;19 if(!dfd.length) return;20 console.log("进来");21 //对象监控对象遍历如果任一个对象没有解决或者失败就返回22 for(var i = dfd.length - 1; i >= 0; i--) {23 if(dfd[i] && !dfd[i].resolved || dfd[i].rejected) {24 return;25 }26 dfd.splice(i, 1);27 }28 _exec(doneArr)29 },30 //解决失败31 reject: function() {32 //设置当前监控状态是失败33 this.rejected = true;34 //没有监控对象取消35 if(!dfd.length) return;36 //清楚监控对象37 dfd.splice(0)38 _exec(failArr)39 }40 }41 that.Deferred = function() {42 return new Promise();43 };44 //回调执行方法45 function _exec(arr) {46 var i = 0,47 len = arr.length;48 for(; i < len; i++) {49 try {50 arr[i] && arr[i]();51 } catch(e) {}52 }53 };54 //监控异步方法参数:监控对象55 that.when = function() {56 //设置监控对象57 console.dir(arguments)58 dfd = slice.call(arguments);59 var i = dfd.length;60 //向前遍历监控对象,最后一个监控对象索引值length-161 for(--i; i >= 0; i--) {62 //不存在监控对象,监控对象已经解决,监控对象失败63 if(!dfd[i] || dfd[i].resolved || dfd[i].rejected || !dfd[i] instanceof Promise) {64 dfd.splice(i, 1)65 }66 }67 //返回等待者对象68 return that;69 };70 //解决成功回调函数添加方法71 that.done = function() {72 //向成功毁掉函数容器中添加回调方法73 doneArr = doneArr.concat(slice.call(arguments));74 return that;75 };76 //解决失败回调函数添加方法77 that.fail = function() {78 //向失败回调函数中添加方法79 failArr = failArr.concat(slice.call(arguments));80 return that;81 };82 }
测试:
1 var waiter = new Waiter();//创建一个等待者实例 2 var first = function() { 3 var dtd = waiter.Deferred(); 4 setTimeout(function() { 5 dtd.resolve(); 6 }, 5000) 7 return dtd;//返回监听这对象 8 }() 9 var second = function() {//第二个对象10 var dtd = waiter.Deferred();11 setTimeout(function() {12 dtd.resolve();13 }, 10000)14 return dtd;15 }()16 waiter.when(first, second).done(function() {17 console.log("success")18 }, function() {19 console.log("success again")20 }).fail(function() {21 console.log("fail")22 })
结果
总结:通过创建不同的监听对象,判断对象状态调用失败或者成功的回调函数
设计模式(等待者模式)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。