2016-02-04 2 views
0

Я пытаюсь следующий код:

var x=$.get(); 
x.promise(); 

var y=new $.Deferred(); 
y.promise(); 

, чтобы сделать сравнение между $.Deferred().promise and $.get().promise. В обоих случаях (x.promise() и y.promise()), Chrome отладчик приводит меня к же строки исходного кода JQuery:

promise: function(obj) { 
    return obj != null ? jQuery.extend(obj, promise) : promise; 
} 

Однако x.promise==y.promise возвращает ложь !!! Почему? Я не могу дать объяснения ...

Мне нужна помощь. Спасибо

+3

, потому что это другое обещание, другой объект ... или '({})! = ({})' –

+0

Два посыла объекты и в Js двух объектов не равны. – Jai

+0

Я не сравниваю объекты обещания, а сам объект функции. Почему бы не ссылаться на то же место памяти, где находится функциональный объект метода .promise? –

ответ

1

Илиас То есть, потому что это не тот же экземпляр об объекте defer и объектно promise, даже они создают из тех же коды ... Каждый раз, когда вы звоните jQuery.Deferred метод создаст новый объект.

Deferred: function(func) { 
    // notice, these define is in the Deferred method, every time is whole new object 
    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 = { 
      state: function() { 
       return state; 
      }, 
      always: function() { 
       deferred.done(arguments).fail(arguments); 
       return this; 
      }, 
      then: function(/* fnDone, fnFail, fnProgress */) { 
       var fns = arguments; 
       return jQuery.Deferred(function(newDefer) { 
        jQuery.each(tuples, function(i, tuple) { 
         var action = tuple[ 0 ], 
          fn = jQuery.isFunction(fns[ i ]) && fns[ i ]; 
         // deferred[ done | fail | progress ] for forwarding actions to newDefer 
         deferred[ tuple[1] ](function() { 
          var returned = fn && fn.apply(this, arguments); 
          if (returned && jQuery.isFunction(returned.promise)) { 
           returned.promise() 
            .done(newDefer.resolve) 
            .fail(newDefer.reject) 
            .progress(newDefer.notify); 
          } else { 
           newDefer[ action + "With" ](this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments); 
          } 
         }); 
        }); 
        fns = null; 
       }).promise(); 
      }, 
      // Get a promise for this deferred 
      // If obj is provided, the promise aspect is added to the object 
      promise: function(obj) { 
       return obj != null ? jQuery.extend(obj, promise) : promise; 
      } 
     }, 
     deferred = {}; 
+0

Обратите внимание, что метод 'get' - это get' defer' object из метода '' Отложенный''. – Jelly

Смежные вопросы