Kaip grąžinti vertę iš asinchroninio atgalinio ryšio funkcijos?

Šis klausimas kelis kartus užduodamas SO. Bet aš vis dar negaliu gauti medžiagos.

Aš noriu gauti šiek tiek vertės atgalinio ryšio. Pažvelkite į žemiau esantį scenarijų.

 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 

Jei bandau grąžinti šią vertę tiesiog „neapibrėžta“. Aš sekiau keletą idėjų iš SO, bet vis tiek nepavyko.

Tai yra:

 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 yra nustatytas liepos 27 d. 11, 19:12 2011-07-27 19:12
@ 3 atsakymai

Tai neįmanoma, nes negalite grįžti iš asinchroninio skambučio į sinchroninį metodą.

Tokiu atveju jums reikia atsiųsti atgalinį ryšį, kuris gaus grąžinimo vertę

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

Faktas yra tai, kad jei vidinis funkcijų skambutis yra asinchroninis, visos šio skambučio „įvyniojimo“ funkcijos taip pat turi būti asinchroninės, kad būtų galima grąžinti atsakymą.

Jei turite daug atšaukimų, galite apsvarstyti nardymą ir pažadų biblioteką, pvz., Q.

377
27 июля '11 в 19:15 2011-07-27 19:15 atsakymą pateikė Sean Kinsey, liepos 27 d. 11, 19:15 2011-07-27 19:15

Nėra prasmės grąžinti atgalines reikšmes. Vietoj to atlikite „foo ()“ darbą, kurį norite atlikti viduje , savo atgalinio ryšio.

Asinchroninius atšaukimus naudoja naršyklė arba kai kurios sistemos, pavyzdžiui, „Google“ geokodavimo biblioteka, kai įvyksta įvykiai. Grįžimo verčių nėra. Atgalinio ryšio funkcija gali grąžinti vertę, kitaip tariant, tačiau funkcija, kuri skambina funkcijai, neatsižvelgs į grąžinimo vertę.

18
27 июля '11 в 19:13 2011-07-27 19:13 atsakymas pateikiamas Pointy liepos 27 d. 11 val. 19:13 2011-07-27 19:13

Jei naudojate jQuery, galite tai padaryti: http://api.jquery.com/category/deferred-object/

Tai leidžia jums atidėti atgalinio ryšio funkcijos vykdymą, kol bus atlikta „ajax“ užklausa (arba bet kokia asinchroninė operacija). Tai taip pat gali būti naudojama skambinant atgaliniu ryšiu, kai tik baigsite kelis kartus.

14
27 июля '11 в 20:35 2011-07-27 20:35 atsakymą pateikė Alex Heyd, liepos 27 d. 11, 20:35 2011-07-27 20:35