Câu hỏi này được hỏi nhiều lần trong SO. Nhưng tôi vẫn không thể kiếm được.Cách trả về giá trị từ hàm gọi lại không đồng bộ?
Tôi muốn nhận được một số giá trị từ gọi lại. Hãy xem kịch bản bên dưới để làm rõ.
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
Nếu tôi cố gắng trả lại giá trị đó chỉ nhận được "không xác định". Tôi đã làm theo một số ý tưởng từ SO, nhưng vẫn không thành công.
Đó là:
function foo(address){
var returnvalue;
geocoder.geocode({ 'address': address}, function(results, status) {
returnvalue = results[0].geometry.location;
})
return returnvalue;
}
foo(); //still undefined
Bất kỳ ai đến đây [** vui lòng đọc câu hỏi này trước **] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call). Nó giải thích cách giải quyết vấn đề này một cách hiệu quả. –
** [Tại sao biến của tôi không bị thay đổi sau khi tôi sửa đổi nó bên trong một hàm? - Tham chiếu mã không đồng bộ] (http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron) ** cũng cung cấp một lời giải thích tổng quát hơn, chi tiết hơn về vấn đề này. –
Sử dụng Q hoặc bất kỳ biến thể nào của nó, như thư viện $ q đi kèm với angularJs. Và không bao giờ nhìn lại. Các hàm không đồng bộ ngay lập tức trả về không xác định. Vì vậy, không bao giờ lãng phí thời gian của bạn đang cố gắng làm công cụ trên không xác định. Cũng không bao giờ sử dụng từ khóa 'return' trong các hàm async của bạn, như bạn thường làm. Thay vào đó hãy sử dụng lời hứa hoãn lại. deferred.resolve (STUFF bạn muốn làm), sau đó bạn có thể đơn giản trả về điều đó, 'return deferred.promise; '. :) – ISONecroMAn