2012-09-18 40 views
6

Khi khung của tôi phát triển, tôi quyết định chia thành các tệp, thay vì để nó trong tệp thiết kế chính. Tuy nhiên, bằng cách đó, sự trở lại của một hàm không trả về bất kỳ giá trị nào.Biến không được trả về từ chức năng AJAX

dữ liệu không trống - nếu tôi cảnh báo các giá trị trong tệp js chúng có ở đó!

Các chức năng:

1 chức năng trong tập tin .js (được bao gồm trước khi thực hiện)

   var lock_get = 0; 
      function get_data(data, destination) 
      { 

       if (lock_get == 0) 
       { 
        lock_get = 1; 
        $.ajax({ 
         type: "POST", 
         url: destination, 
         async: true, 
         data: data, 
         success: function(data) 
         { 
          lock_get = 0; 
          if (data) 
          { 
           return data; 
          } 
         } 
        }); 
       } 
      }; 

Vì vậy, và đây là phần thi:

var test = get_data(data, destination); 
    notice(test); 

và thử nghiệm là trống rỗng ... Tôi đã thử nhiều cách khác nhau để viết nhưng tôi đoán tôi đã hiểu sai về khả năng của js?

+0

Thực hiện async: false. – Tuscan

+4

@Tuscan No. [async: false không được dùng nữa và luôn luôn là một ý tưởng tồi] (http://api.jquery.com/jQuery.ajax/) –

+0

có thể trùng lặp của [Cách trả lại phản hồi từ cuộc gọi Ajax?] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) –

Trả lời

9

Bạn không thể thực hiện điều đó: vì cuộc gọi không đồng bộ, hàm get_data không thể trả về kết quả của cuộc gọi ajax.

Những gì bạn cần làm là cung cấp gọi lại cho hàm get_data và xử lý kết quả trong cuộc gọi lại.

function get_data(data, destination, callback) 
     { 

      if (lock_get == 0) 
      { 
       lock_get = 1; 
       $.ajax({ 
        type: "POST", 
        url: destination, 
        async: true, 
        data: data, 
        success: function(data) 
        { 
         lock_get = 0; 
         if (data && callback) 
         { 
          callback(data); 
         } 
        } 
       }); 
      } 
     }; 

Và gọi nó là như thế:

get_data(data, destination, function(test){ 
    notice(test); 
}); 
+0

Nghiêm túc cảm ơn đã không suy nghĩ về việc gọi lại! Tất nhiên nó hoạt động ngay bây giờ:) ... –

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