Kako vratiti vrijednost iz asinkrone funkcije povratnog poziva?

Ovo pitanje je postavljeno mnogo puta u SO. Ali još uvijek ne mogu dobiti materijal.

Želim dobiti neku vrijednost iz povratnog poziva. Pogledajte skriptu u nastavku radi pojašnjenja.

 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 

Ako pokušam vratiti tu vrijednost jednostavnim dobivanjem "undefined". Slijedio sam neke ideje iz SO-a, ali još uvijek ne uspijevam.

Ovo je:

 function foo(address){ var returnvalue; geocoder.geocode( { 'address': address}, function(results, status) { returnvalue = results[0].geometry.location; }) return returnvalue; } foo(); //still undefined 
366
27 июля '11 в 19:12 2011-07-27 19:12 Gowri je postavljen 27. srpnja 2011. u 19:12 2011-07-27 19:12
@ 3 odgovora

To nije moguće jer se ne možete vratiti iz asinkronog poziva unutar sinkronog postupka.

U tom slučaju, morate proslijediti povratni poziv u foo, koji će primiti povratnu vrijednost

 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 }); 

Činjenica je da ako je interni poziv funkcije asinkroni, tada sve "omotavajuće" funkcije ovog poziva moraju biti asinkrone kako bi se "vratio" odgovor.

Ako imate puno povratnih poziva, razmislite o ronjenju i korištenju obećane knjižnice kao što je Q.

377
27 июля '11 в 19:15 2011-07-27 19:15 odgovor je dao Sean Kinsey 27. srpnja '11 u 19:15 2011-07-27 19:15

Nema smisla vraćati vrijednosti iz povratnog poziva. Umjesto toga, napravite "foo ()" rad koji želite obaviti unutar vašeg povratnog poziva.

border=0

Asinkroni povratni pozivi pozivaju se preglednikom ili nekim okvirima, kao što je Google knjižnica za geokodiranje, kada se dogode događaji. Nema mjesta za povratne vrijednosti. Callback funkcija može vratiti vrijednost, drugim riječima, ali kod koji poziva funkciju neće obratiti pozornost na povratnu vrijednost.

18
27 июля '11 в 19:13 2011-07-27 19:13 odgovor je dan 27. srpnja '11 u 19:13 2011-07-27 19:13

Ako koristite jQuery, možete to učiniti: http://api.jquery.com/category/deferred-object/

To vam omogućuje da odgodite izvršavanje funkcije povratnog poziva dok se ne izvrši ajax zahtjev (ili bilo koja async operacija). To se također može koristiti za pozivanje povratnog poziva čim se završi nekoliko ajax zahtjeva.

14
27 июля '11 в 20:35 2011-07-27 20:35 odgovor je dao Alex Heyd 27. srpnja '11 u 20:35 2011-07-27 20:35