2014-04-09 28 views
47

Mam funkcję javascript, w której chcę zwrócić wartość, którą otrzymuję po metodzie return. lepiej widoczny niż wyjaśniaćwartość zwracana po obietnicy

function getValue(file){ 
    var val; 
    lookupValue(file).then(function(res){ 
     val = res.val; 
    } 
    return val; 
} 

Jaki jest najlepszy sposób to zrobić z obietnicą. Rozumiem, że return val powróci przed tym, jak funkcja lookupVallue to zrobiła, ale nie mogę return res.val, ponieważ powraca tylko z wewnętrznej funkcji.

+0

@OneKitten pytanie połączyć nie jest używając obietnicy, przekazuje ona funkcję jako callback, to jest całkiem inne, myślę. – pedalpete

+1

To ta sama koncepcja, obietnice są nadal asynchroniczne. –

+1

http://stackoverflow.com/q/22536385/1348195 –

Odpowiedz

16

Najlepszym sposobem na to byłoby użyć obietnicę funkcję powracającego jak to jest, jak to

lookupValue(file).then(function(res) { 
    // Write the code which depends on the `res.val`, here 
}); 

funkcję, która wywołuje funkcję asynchronicznego nie może czekać, aż funkcja zwraca wartość asynchroniczny. Ponieważ po prostu wywołuje funkcję asynchroniczną i wykonuje w niej resztę kodu. Tak więc, gdy funkcja asynchroniczna zwraca wartość, nie zostanie ona odebrana przez tę samą funkcję, która ją wywołała.

Ogólną ideą jest napisanie kodu, który zależy od wartości zwracanej funkcji asynchronicznej, w samej funkcji asynchronicznej.

+3

Nie mylisz się, ale Twoje rozwiązanie narusza zasadę hermetyzacji. Obiekt lub funkcja wywołująca getValue (...) nie powinna wiedzieć i nie powinna wiedzieć o funkcji lookupValue (...). W ten sposób, jeśli zmieni się dokładna procedura w getValue (...), funkcje, które na niej polegają, nie muszą być aktualizowane. –

13

pomocą wzoru wzdłuż tych linii:

function getValue(file) { 
    return lookupValue(file); 
} 

getValue('myFile.txt').then(function(res) { 
    // do whatever with res here 
}); 

(choć jest to nieco zbędny, jestem pewien rzeczywisty kod jest bardziej skomplikowane)

Powiązane problemy