2009-08-04 32 views
39

tôi sử dụng nguyên mẫu để làm phát triển AJAX của tôi, và tôi sử dụng mã như thế này:Làm thế nào để trả về văn bản phản hồi AJAX?

somefunction: function(){ 
    var result = ""; 
    myAjax = new Ajax.Request(postUrl, { 
     method: 'post', 
     postBody: postData, 
     contentType: 'application/x-www-form-urlencoded', 
     onComplete: function(transport){ 
      if (200 == transport.status) { 
       result = transport.responseText; 
      } 
     } 
    }); 
    return result; 
} 

Và tôi thấy rằng "kết quả" là một chuỗi rỗng. Vì vậy, tôi đã thử điều này:

somefunction: function(){ 
    var result = ""; 
    myAjax = new Ajax.Request(postUrl, { 
     method: 'post', 
     postBody: postData, 
     contentType: 'application/x-www-form-urlencoded', 
     onComplete: function(transport){ 
      if (200 == transport.status) { 
       result = transport.responseText; 
       return result; 
      } 
     } 
    }); 

} 

Nhưng nó cũng không hoạt động. Làm thế nào tôi có thể nhận được responseText cho phương pháp khác để sử dụng?

Trả lời

27

hãy nhớ rằng onComplete được gọi là dài sau khi hàm someFunction được thực hiện. Những gì bạn cần làm là chuyển một hàm gọi lại đến hàm số như một tham số. Hàm này sẽ được gọi khi quá trình này được thực hiện hoạt động (ví dụ: onComplete):

somefunction: function(callback){ 
    var result = ""; 
    myAjax = new Ajax.Request(postUrl, { 
     method: 'post', 
     postBody: postData, 
     contentType: 'application/x-www-form-urlencoded', 
     onComplete: function(transport){ 
      if (200 == transport.status) { 
       result = transport.responseText; 
       callback(result); 
      } 
     } 
    }); 

} 
somefunction(function(result){ 
    alert(result); 
}); 
+0

Câu trả lời của bạn rất tuyệt vời, phong cách/chức năng hơn và thực sự tuyệt vời. Tuy nhiên, [ai đó] -s trả lời là điểm: không đồng bộ: sai là dễ dàng hơn và dễ dàng hơn những gì tác giả câu hỏi muốn (nhưng giải pháp của bạn là mở rộng hơn và linh hoạt). –

+1

không đồng bộ: false sẽ tạm dừng trình duyệt cho đến khi nhận được phản hồi. Nếu kết nối mạng chậm, vì vậy phải mất một vài giây để kết nối với máy chủ, sau đó toàn bộ trình duyệt có thể bị đóng băng trong vài giây và sẽ không phản hồi lại đầu vào của người dùng. Đây không phải là khả năng sử dụng tốt. Nó có thể dễ dàng hơn, nhưng nó không hoạt động tốt, và do đó ** 'không đồng bộ: false' sẽ không bao giờ được sử dụng **. – Marius

+0

xin lỗi, tôi đã không thực sự sử dụng không đồng bộ trước đây. Bạn nói đúng, do đó, về cơ bản giống như 'function ajaxLoader() {var fAjaxLoaded = false; $. Ajax (..., success: function() {fAjaxLoaded = true;}); while (fAjaxLoaded); return ...} ' –

3

Làm cách nào để thêm "không đồng bộ: sai" vào mã của bạn? Trong trường hợp của tôi, nó hoạt động tốt :)

+0

đánh bại mục đích của ajax phải không? –

+5

Đó là điều xấu vì, với các yêu cầu đồng bộ, bạn đang chặn tất cả thực thi JS trong trình duyệt cho đến khi yêu cầu trả về. – finishingmove

+1

Đánh bại mục đích nhưng tiết kiệm trong ngày của bạn. –

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