CNode

管理回调的传统方式

分享
Fflamingtop发布于10 年前最后回复10 年前12 回复5164 浏览0 收藏

很多人接触到callback hell,就立刻想到promise,generator,想到ES7的async/await,这些话题上的帖子论坛里不少了。

但实际上,在大部分的JS编程场景里管理回调并没有那么吓人,也不是非得一上来就Promise,generator,非得可着劲地用async/await。

比如很常见的回掉代码结构

jQuery('.myclass').on('event', function () {
    ...
    ...
	...
    ...
	...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
});

回调太长可以“提取”,提取以后的回调,给他一个有意义的名字,代码立刻好读不少

jQuery('.myclass').on('event', meaningfulName);

function meaningfulName() {
   ...
    ...
    ...
    ...	
}

如果要用到很多这样的回调,就把他们“封装”成模块

var mymoduleHandler = (function() {
  return {
    meaningfulName1: handler1,
	meaningfulName2: handler2
  };
  
  function handler1() {}
  function handler2() {}
}());

这样,消费这些回调的代码就可以缩短,获得最佳可读性

jQuery('.element').on('event', mymoduleHandler.meaningfulName1);
jQuery('.element').on('event', mymoduleHandler.meaningfulName2);

如果要控制回调的执行上下文

jQuery('.element').on('event', mymoduleHandler.meaningfulName3.bind(this));

很多时候,用好“提取”和“封装”其实就能很好地管理好回调了。

查看回复

回复 (12)

I
i5ting#1·10 年前

在多多的了解了解吧

  • Node.js里有EventEmit机制
  • cnode源码里用的是朴大写的EventProxy

不是不能实现,只是不够好而已

M
mosaic101#2·10 年前

用pronise并不一定是为了解决callback hell,我是为了更好的捕捉error,一个方法一个自定义error,多层嵌套看起来,每一次都要先判断,很恶心。自定义的error无法满足大项目的需求,所以改用了promise。当然,一开始写js代码还是应该从callback写起

M
mosaic101#4·10 年前
引用 i5ting@mosaic101 首先理解积木是怎么回事儿,哈哈

@i5ting 狼叔(๑•̀ㅁ•́ฅ✧早 From Noder

B
blackjack#5·10 年前

赞同,并不是必须使用的,自己注意点一般不会写金字塔,

F
flamingtop#7·10 年前
引用 i5ting在多多的了解了解吧 Node.js里有EventEmit机制 cnode源码里用的是朴大写的EventProxy 不是不能实现,只是不够好而已

@i5ting EventEmitter 和 EventProxy 是在程序设计的时候解耦用的更多,本身不是用来规避回调的,至少主要目的不是。

F
flamingtop#8·10 年前
引用 mosaic101用pronise并不一定是为了解决callback hell,我是为了更好的捕捉error,一个方法一个自定义error,多层嵌套看起来,每一次都要先判断,很恶心。自定义的error无法满足大...

@mosaic101 promise做错误处理更好写一点,但promise有解决callback hell的一些场景下的问题,主要是它方便级联,但仍然不直接解决级联内的callback函数本身的可读可维护问题,一定的提取和封装还是需要的。

F
flamingtop#9·10 年前

我并不是要一概否定高级技巧,而是要强调基本程序设计方法的实用性。

M
MiguelValentine#10·10 年前

不回调,不node,什么async,promise,co以及其他,恕我直言,都是[哔]。

D
dou4cc#11·10 年前

看看隔壁lisp是怎么解决金字塔问题的:不缩进

S
slclub#12·10 年前

哈哈不缩进

参与回复
登录后即可参与回复。登录