LoginSignup
2
0

More than 5 years have passed since last update.

気持ち悪いjQuery.Deferred()の挙動

Last updated at Posted at 2018-05-17

なんでタイプエラーにならないの。。。


$.Deferred().resolve()
.then(null)
.then(function(){
    alert('hoge');
});

確かにjQuery内部の処理を見ると、nullでも次のpromiseを見るようになっていた。。
このため、外部関数をnullになっている箇所でコールするのに失敗してもスルーするようになってしまっていた。。
うーむ。。

//※これはjQuery2.1.3のソース。
jQuery.extend({
    Deferred: function( func ) {
        var tuples = [
                // action, add listener, listener list, final state
                [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
                [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
                [ "notify", "progress", jQuery.Callbacks("memory") ]
            ],
            state = "pending",
            promise = {
                then: function( /* fnDone, fnFail, fnProgress */ ) {
                    var fns = arguments; //ここにnullがはいる
                    return jQuery.Deferred(function( newDefer ) {
                        jQuery.each( tuples, function( i, tuple ) {
                            var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; //fnはfalse
                            // deferred[ done | fail | progress ] for forwarding actions to newDefer
                            deferred[ tuple[1] ](function() {
                                var returned = fn && fn.apply( this, arguments ); //returnedもfalse
                                if ( returned && jQuery.isFunction( returned.promise ) ) {
                                    returned.promise()
                                        .done( newDefer.resolve )
                                        .fail( newDefer.reject )
                                        .progress( newDefer.notify );
                                } else { //新しいDeferredをresolvedで返す。
                                    newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
                                }
                            });
                        });
                        fns = null;
                    }).promise();
                },
                      
            },

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0