Jak zwrócić wartość z funkcji asynchronicznego wywołania zwrotnego? [duplikat]

to pytanie ma już odpowiedzi tutaj : Jak zwrócić odpowiedź z połączenia asynchronicznego? (42 odpowiedzi) Zamknięty 6 lat temu .

To pytanie jest zadawane wiele razy w SO. Ale nadal nie mogę dostać rzeczy.

Chcę uzyskać jakąś wartość od callback. Spójrz na poniższy skrypt dla wyjaśnienia.

function foo(address){

      // google map stuff
      geocoder.geocode( { 'address': address}, function(results, status) {
          results[0].geometry.location; // I want to return this value
      })

    }
    foo(); //result should be results[0].geometry.location; value

Jeśli spróbuję zwrócić tę wartość, po prostu dostając "undefined". Śledziłem kilka pomysłów z SO, ale nadal zawodzi.

Są to:

function foo(address){
    var returnvalue;    
    geocoder.geocode( { 'address': address}, function(results, status) {
        returnvalue = results[0].geometry.location; 
    })
    return returnvalue; 
}
foo(); //still undefined
Author: mauris, 2011-07-27

3 answers

Jest to niemożliwe, ponieważ nie można powrócić z asynchronicznego wywołania wewnątrz metody synchronicznej.

W tym przypadku musisz przekazać wywołanie zwrotne do foo, które otrzyma wartość zwracaną

function foo(address, fn){
  geocoder.geocode( { 'address': address}, function(results, status) {
     fn(results[0].geometry.location); 
  });
}

foo("address", function(location){
  alert(location); // this is where you get the return value
});

Rzecz w tym, że jeśli wewnętrzne wywołanie funkcji jest asynchroniczne, to wszystkie funkcje "zawijające" to wywołanie musi być również asynchroniczne, aby "zwrócić" odpowiedź.

Jeśli masz dużo wywołań zwrotnych, możesz rozważyć skorzystanie z biblioteki promise, takiej jak Q .

 497
Author: Sean Kinsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 05:31:43

Zwracanie wartości z wywołania zwrotnego nie ma sensu. Zamiast tego wykonaj pracę" foo ()", którą chcesz wykonać wewnątrz twojego wywołania zwrotnego.

Asynchroniczne wywołania zwrotne są wywoływane przez przeglądarkę lub przez jakiś framework, taki jak biblioteka Google geocoding, gdy zdarzają się zdarzenia. Nie ma miejsca na zwracane wartości. Funkcja wywołania zwrotnego Może zwrócić wartość, innymi słowy, ale kod wywołujący funkcję nie zwróci uwagi na zwracaną wartość.

 30
Author: Pointy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-10 14:44:47

Jeśli przypadkiem używasz jQuery, możesz spróbować: http://api.jquery.com/category/deferred-object/

Pozwala na odroczenie wykonania funkcji zwrotnej do czasu zakończenia żądania ajax (lub dowolnej operacji asynchronicznej). Może być również używany do wywołania połączenia zwrotnego, gdy kilka żądań ajax zostały zakończone.

 16
Author: Alex Heyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-27 17:35:55