2017-01-09 39 views
6

Próbuję zrozumieć, dlaczego następujący kod zachowuje się odmiennie z Q.defer()() i obiecująRóżnica między Q.defer()() Obietnicy

Case 1: Kiedy” m (za pomocą Q.defer)

getDocument(id) 
.then(function (response) { 
    console.log('in first then') 
    return 'from two'; 
}).then(function (response) { 
    console.log(response) 
}); 

var getDocument=function(){ 
    var b = Q.defer(); 
    b.resolve('from getDocument'); // here will do some async operation..this is just an example 
    return b.promise; 
} 

wyjściowa:

in first then 
undefined 

Przypadek 2: za pomocą obietnicy()

getDocument(id) 
.then(function (response) { 
    console.log('in first then') 
    return 'from two'; 
}).then(function (response) { 
    console.log(response) 
}); 

var getDocument=function(){ 
    return Promise.resolve('from getDocument'); 
} 

wyjściowa:

in first then   
from two 

Pytanie

  1. Dlaczego jest różnica w wydajności?
  2. Wiem, że Q.defer to anty-wzór, ale jak wybrać, kiedy użyć czego?
+1

można udostępnić plunkr/skrzypce ..? Wątpię, aby 1. wyjście nie zawierało 'undefined' w 2nd' console.log' –

+1

Która wersja Q ... ponieważ 'v1' działa dobrze –

+0

_" Wiem, że Q.defer to anty-wzorzec, ale jak wybrać, kiedy użyć czego? "_ Użyj konstruktora obietnicy, aby owinąć obietnicę w asynchroniczne operacje bez obietnicy. Użyj '.defer' w sytuacjach, w których użycie konstruktora Promise byłoby bardzo skomplikowane lub kłopotliwe, a' .defer' byłby bardziej elegancki (powinno to być prawie nigdy). – JLRishe

Odpowiedz

2

W rzeczywistości oba przykłady zwracają ten sam wynik (ta sama kolejność). Zaznacz to codepen Example

var getDocument=function(){ 
    var b = Q.defer(); 
    b.resolve('Q from getDocument'); // here will do some async operation..this is just an example 
    return b.promise; 
} 

getDocument(1) 
.then(function (response) { 
    console.log('Q in first then') 
    return 'Q from two'; 
}).then(function (response) { 
    console.log(response) 
}); 

var getDocumentP=function(){ 
    return Promise.resolve('P from getDocument'); 
} 

getDocumentP(1) 
.then(function (response) { 
    console.log('P in first then') 
    return 'P from two'; 
}).then(function (response) { 
    console.log(response) 
}); 

2) Można zobaczyć tu kilka zastosowań Q.defer: Q.defer you´re doing it wrong

+1

'Różnica dzieje się dlatego, że obietnice zostały zbudowane niewłaściwie" - z wyjątkiem tego, że jest źle źle, –

+0

Nie widzę w tym nic złego ... Wiem, że jeden nie powinieneś używać odroczonego wzorca, jeśli masz już obietnicę powrotu ... ale tylko dla mojego zrozumienia chcę wiedzieć, dlaczego te dwa podejścia dają różne wyniki. –

+0

Dziwna rzecz. Testuję twój kod wewnątrz codepen i z Q pasuje do Promises one: http://codepen.io/tuliofaria/pen/GrpqPE?editors=1111 –