2 Comments

  1. 看看jquery1.7的代码:https://github.com/jquery/jquery/blob/1.7rc2/src/deferred.js
    1.7时defer源码里的then是简单的快捷方法,没其他功能。

    1.8以前then的效果:
    var defer = $.Deferred(),
    filtered = defer.then(function( value ) {
    //defer的一个done回调
    }).done(function( value ) {
    //defer的另一个done回调,跟then无关系,
    });
    defer.resolve( 5 );

    到了jquery1.8以后,then和pipe方法合并了,不知为啥要合并,可能觉得多了个一样的接口迷惑吧。
    用pipe这个名字就比较好理解,把回调方法放入一个管道里,这个回调方法完成后还可以通过管道进入另一个回调。有一个用法是使用then做数据过滤:
    var defer = $.Deferred(),
    filtered = defer.then(function( value ) {
    return value * 2;
    }).done(function( value ) {
    //这里的done是then里的函数执行完后的defer发起的,而不是原defer发起
    //then里处理过后的数据就可以“流”到这里了,所以还是用名字pipe比较好理解
    alert(“Value is ( 2*5 = ) 10: ” + value );
    });;
    defer.resolve(5);

    • raphealguo

      恩,用pipe的概念确实好理解,代码里边为什么不直接
      :deferred[ tuple[1] ](fn)
      就是因为fn处理后的值需要流道下一个done的回调(或其他回调)里边去
      模拟了Linux地下管道 “|” 的概念:
      grep a | grep b | .. | ..

bang 进行回复 取消回复

电子邮件地址不会被公开。


× 3 = 21

您也可以使用微博账号登陆