無法從非同步回呼函數擷取值
Stack Overflow 上有很多執行緒討論這個常見問題。儘管進行了大量搜索,但一些開發人員在從回調訪問值時仍然面臨困難。
主要挑戰在於同步方法無法從非同步呼叫傳回值。如提供的範例所示:
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
嘗試直接傳回所需值會產生「未定義」回應。隨後,提出了修改建議,但沒有效果。
此類嘗試的範例:
function foo(address){ var returnvalue; geocoder.geocode( { 'address': address}, function(results, status) { returnvalue = results[0].geometry.location; }) return returnvalue; } foo(); //still undefined
解決方案
解決方案需要透過對 foo函數的回調,該函數隨後將收到返回值value:
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 等 Promise 庫可以簡化處理大量回調。這些框架提供了一種方便的方法來管理非同步操作並以更有效率和結構化的方式存取其結果。
以上是如何從 JavaScript 中的非同步回呼函數檢索值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!