Як вярнуць значэнне з асінхроннай функцыі зваротнага выкліку?

Гэтае пытанне задаецца шмат разоў у SO. Але ўсё ж я не магу атрымаць матэрыял.

Я хачу атрымаць некаторую каштоўнасць ад зваротнага выкліку. Паглядзіце на script ніжэй для ўдакладнення.

 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 

Калі я паспрабую вярнуць гэта значэнне, проста атрымаўшы "undefined". Я сачыў за некаторымі ідэямі з SO, але ўсё яшчэ не ўдаецца.

гэта:

 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 27 ліпеня '11 ў 19:12 2011-07-27 19:12
@ 3 адказаў

Гэта немагчыма, так як вы не можаце вярнуцца з асінхроннага выкліку ўнутры сінхроннага метаду.

У гэтым выпадку вам трэба перадаць зваротны выклік foo, які атрымае вяртаецца значэнне

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

Справа ў тым, што калі ўнутраны выклік функцыі асінхроннага, то ўсе функцыі "абкручванні" гэтага выкліку таксама павінны быць асінхроннымі, каб "вярнуць" адказ.

Калі ў вас шмат зваротных выклікаў, вы можаце падумаць пра тое, каб зрабіць апусканне і выкарыстоўваць бібліятэку абяцанняў напрыклад Q .

377
27 июля '11 в 19:15 2011-07-27 19:15 адказ дадзены Sean Kinsey 27 ліпеня '11 ў 19:15 2011-07-27 19:15

Няма сэнсу вяртаць значэння з зваротнага выкліку. Замест гэтага выканайце "foo ()" працу, якую вы хочаце зрабіць ўнутры, ваш зваротны выклік.

border=0

Асінхронныя зваротныя выклікі выклікаюцца браўзэрам або некаторымі фреймворк, такімі як бібліятэка геокодирования Google, калі адбываюцца падзеі. Там няма месца для якiя вяртаюцца каштоўнасцяў. Функцыя зваротнага выкліку можа вярнуць значэнне, іншымі словамі, але код, які выклікае функцыю, не будзе звяртаць увагу на вяртаецца значэнне.

18
27 июля '11 в 19:13 2011-07-27 19:13 адказ дадзены Pointy 27 ліпеня '11 ў 19:13 2011-07-27 19:13

Калі вы выкарыстоўваеце jQuery, вы можаце зрабіць гэта: http://api.jquery.com/category/deferred-object/

Гэта дазваляе адкласці выкананне функцыі зваротнага выкліку да таго часу, пакуль не будзе выкананы запыт ajax (або любая аперацыя async). Гэта таксама можна выкарыстоўваць для выкліку зваротнага выкліку, як толькі некалькі запытаў ajax завершаны.

14
27 июля '11 в 20:35 2011-07-27 20:35 адказ дадзены Alex Heyd 27 ліпеня '11 ў 20:35 2011-07-27 20:35

Іншыя пытанні па пазнаках або Задайце пытанне