2016-02-03 97 views
-1

我剛剛開始學習承諾。我發現他們非常有趣,但我有一些疑問,我無法找到答案。深入瞭解jQuery承諾

  1. 我認爲$.Deferred().promise$.get().promise$.fn.promise().promise只是相同的功能。 我對不對?
  2. 如果我對上一個問題是正確的,爲什麼$.Deferred().promise===$.get().promise返回false?
  3. $('#mybox').hide(3000).promise()例如,將創建一個承諾對象,其中將被解析,一旦動畫隊列將爲空。什麼是的情況下,相當於底層程序:

    I. $.get().promise() : Is it a queue that is being watched? If yes, which one? 
         If no, which is the trigger for the above promise object to be resolved? 
    
        II. var defer=new $.Deferred().promise() : The same question! 
    

希望大家幫我澄清上述...

+0

你應該避免jQuery的承諾,因爲他們不遵守統一的承諾的提案 –

+0

1.他們都是一個承諾,但不一樣的承諾,所以2不會是==更不用說=== 3.I 。一個promise將被解析,任何'then'(或者類似的)回調將以它們所附加的順序被回調,3.II你不會這樣做,因爲你沒有權限訪問延遲執行/拒絕函數來解決承諾(除非jQuery在返回的承諾中公開履行/拒絕) –

+0

@JaromandaX如果回答問題,您可以擴展您的評論並將其發佈爲答案嗎? – twernt

回答

1
  1. 查看源,它們是不同的功能,但他們都返回一個承諾
  2. N/A
  3. I.當一個承諾被解決(通過解決或拒絕),任何then/catch(或jQuery中的情況下,類似的)C已添加的allbacks將以與它們相同的順序回叫
    II。你不會這麼做,因爲你不能訪問延遲解析/拒絕函數來解析promise - 除非jQuery在返回的promise中暴露解析/拒絕,這似乎不是案例
0
  1. 正確。它們都是承諾實現。
  2. 閱讀equality comparisons on MDN。如果所有這些方法都指向相同的函數參考,那麼是的,它們將是平等的。但是,由於您要求===返回false,這意味着這些方法是單獨定義的。
  3. 解決承諾的觸發器是動畫完成時。您需要查看源代碼(具體取決於它們的具體實現hide)。
+0

1. - 他們是**不是**相同的功能 - 閱讀jQuery的來源 –