2010-01-17 38 views
6

Tôi có một hàm javascript yêu cầu một số dữ liệu ajax và lấy lại một đối tượng JSON. Sau đó, nó sẽ trả về đối tượng.Jquery: chờ gọi lại trước khi trở về

Vấn đề là tôi không biết cách làm cho hàm trả về từ cuộc gọi lại Ajax. Tất nhiên

myFunction: function() { 
    $.get(myUrl, function(data) { 
     return data; 
    }); 
} 

không hoạt động, vì hàm bên trong đang trở về thay vì bên ngoài.

Mặt khác thực hiện những gì tôi cần ngay bên trong cuộc gọi lại sẽ phá vỡ phân đoạn MVC của tôi: mã này nằm trong một mô hình và tôi muốn sử dụng đối tượng kết quả trong bộ điều khiển.

Một cách giải quyết tạm thời là

myFunction: function() { 
    var result = $.ajax({ 
     url: myUrl, 
     async: true, 
     dataType: 'text' 
    }).responseText; 
    return eval(result); 
} 

trong đó có những bất lợi của chặn trình duyệt trong khi chờ đợi câu trả lời (và sử dụng eval, mà tôi muốn tránh).

Có giải pháp nào khác không?

+0

Điều này đã được hỏi nhiều lần ... Xem ví dụ: http://stackoverflow.com/questions/31129/how-can-i-return-a-variable-from-a-getjson-function – Shog9

Trả lời

9

Bạn chỉ có thể vượt qua một callback để chức năng của bạn, để xử lý các dữ liệu khi nó đã sẵn sàng:

myFunction: function(callback) { 
    $.get(myUrl, function(data) { 
     callback(data); 
    }); 
} 
+0

Đây là giải pháp sạch nhất cho đến nay. Tôi sẽ sử dụng như gọi lại một phương pháp điều khiển. Hạn chế là cần phải phá vỡ một phương pháp điều khiển thành hai, nhưng tôi đoán tôi sẽ sử dụng giải pháp này. – Andrea

1

Tại sao bạn muốn nó để trả lại đối tượng? Nếu bạn dự định sử dụng đối tượng này sau, cách tốt hơn là đặt hàm bằng cách sử dụng dữ liệu vào gọi lại.

+0

Tôi đã nói rằng trong câu hỏi. Bản thân hàm này nằm trong một mô hình và tôi muốn sử dụng đối tượng trong một bộ điều khiển. Sử dụng đối tượng trong callback là doable, nhưng phá vỡ mô hình MVC. Có lẽ tôi sẽ làm điều đó nếu tôi không tìm thấy lựa chọn thay thế tốt hơn. – Andrea

Các vấn đề liên quan