参考链接: https://segmentfault.com/q/1010000040034919

回调方式

定义方法

  1. function receiver(type, callback) {
  2. document.addEventListener(type, (ev) => {
  3. callback(ev);
  4. });
  5. }

使用

  1. receiver('click', (ev) => {
  2. console.log(ev)
  3. })

链式调用

类似于 promise 调用,只是形式上类似,其实并不是,

方法一

定义

  1. const receiver = (() => {
  2. const callbacks = {};
  3. return function (type) {
  4. const list = callbacks[type];
  5. if (!list) {
  6. document.addEventListener(type, (ev) => {
  7. callbacks[type].forEach(fn => fn(ev));
  8. });
  9. }
  10. return {
  11. then(callback) {
  12. (callbacks[type] ??= []).push(callback);
  13. }
  14. };
  15. };
  16. })();

使用

  1. receiver("click").then(() => console.log("hello"));
  2. receiver("click").then(() => console.log("hi"));
  3. const click = receiver("click");
  4. click.then(() => console.log("aaaaa"));
  5. click.then(() => console.log("bbbbbb"));

方法二

可以多个链式调用
定义

  1. function receiver(type) {
  2. let callbacks = {
  3. fns: [],
  4. then: function(cb){
  5. this.fns.push(cb)
  6. return this
  7. }
  8. }
  9. document.addEventListener(type, function(ev) {
  10. let fns = callbacks.fns.slice()
  11. for(let i = 0, l = fns.length; i < l; i++){
  12. fns[i].call(this, ev)
  13. }
  14. });
  15. return callbacks
  16. }

使用

  1. receiver("click").then(() => console.log("hi")).then(()=>console.log(22));