2012-08-06 38 views
10

Tôi có một cuộc gọi ajax nhưjQuery: chạy ajax cả xử lý - làm và thất bại

$.ajax({ 
     type: 'POST', 
     url: 'addVideo', 
     data: { 
      video_title: title, 
      playlist_name: playlist, 
      url: id 
      // csrfmiddlewaretoken: '{{ csrf_token }}', 
     }, 
     done: bootstrap_alert.success('video saved successfully'), 
     fail: bootstrap_alert.error('There were some errors while saving the video. Please try in a while') 
    }); 

và hành động như

// setting up alerts on action 
bootstrap_alert = function() {} 
bootstrap_alert.success = function(message) { 
    $('#feature').prepend('<div class="alert alert-success"><a class="close" data-dismiss="alert">×</a><span>'+message+'</span></div>'); 
} 
bootstrap_alert.error = function(message) { 
    $('#feature').prepend('<div class="alert alert-error"><a class="close" data-dismiss="alert">×</a><span>'+message+'</span></div>'); 
} 

Khi kết thúc trước làm cho cuộc gọi ajax, tôi nhìn thấy cả hai thông báo tại đồng thời

video saved successfully 
There were some errors while saving the video. Please try in a while 

Đó có phải là tôi không thực hiện cuộc gọi ajax đúng không?

CẬP NHẬT
thay đổi done-success kết quả trong cùng một hành vi

// send the data to the server using .ajax() or .post() 
     $.ajax({ 
      type: 'POST', 
      url: 'addVideo', 
      data: { 
       video_title: title, 
       playlist_name: playlist, 
       url: id 
       // csrfmiddlewaretoken: '{{ csrf_token }}', 
      }, 
      success: bootstrap_alert.success('video saved successfully'), 
      fail: bootstrap_alert.error('There were some errors while saving the video. Please try in a while') 
     }); 

Câu trả lời là máy chủ HTTP/1.0" 200 3200, tôi tin rằng các fail không nên được gọi

+0

Bạn có chắc chắn '$ ('# feature')' không bị sửa đổi bởi một phần khác của mã không? –

+0

Có, nó không được sửa đổi – fullstackcrash

Trả lời

15

Giá trị được mong đợi là chức năng, gọi lại. Nhưng, những gì bạn đang làm là gọi cho họ ngay lập tức. Quấn hàm callbacks của bạn xung quanh trong các chức năng ẩn danh.

$.ajax({ 
    type: 'POST', 
    url: 'addVideo', 
    data: { video_title: title, playlist_name: playlist, url: id } 
}).done(function(){ 
    bootstrap_alert.success('video saved successfully'); 
}).fail(function(){ 
    bootstrap_alert.error('There were some errors while saving the video. Please try in a while'); 
}); 
+0

điều này thật tuyệt, tôi vừa nhận ra giải pháp này, cảm ơn bạn – fullstackcrash

7

done luôn gọi. Đó là nghĩa vụ phải xảy ra. Bạn nên xử lý mã thành công của mình trong thuộc tính success.

+2

Nói cách khác, 'done' được sử dụng khi bạn cần làm điều gì đó cho dù yêu cầu thất bại hay không, như loại bỏ chỉ báo tải từ màn hình –

+0

nhưng không nên được gọi trên 'HTTP /1.0 "200 3200' phản hồi, phải không? – fullstackcrash

+0

thay đổi' done' thành 'success' vẫn dẫn đến hành vi tương tự – fullstackcrash

0

Thử thay thế done bằng successfail bằng error? Bạn đang sử dụng chúng làm tùy chọn trong khi chúng là móc gọi lại.

+0

Tôi đã thử @Jill, cùng một hành vi như trước đây – fullstackcrash

1

thay đổi như thế này làm việc

// send the data to the server using .ajax() or .post() 
     $.ajax({ 
      type: 'POST', 
      url: 'addVideo', 
      data: { 
       video_title: title, 
       playlist_name: playlist, 
       url: id 
       // csrfmiddlewaretoken: '{{ csrf_token }}', 
      }, 
      success: function(response, textStatus, jqXHR){ 
       // log a message to the console 
       console.log("Hooray, it worked!"); 
       bootstrap_alert.success('video saved successfully'); 
      }, 

      // callback handler that will be called on error 
      error: function(jqXHR, textStatus, errorThrown){ 
       // log the error to the console 
       console.log("The following error occured: "+ textStatus, errorThrown); 
       bootstrap_alert.error('There were some errors while saving the video. Please try in a while'); 
      }, 
     }); 
2

Bạn cần phải bọc nó trong một chức năng ẩn danh (như những người khác đã ghi nhận). Nhưng, tôi đã không thấy bất cứ ai đề cập đến lý do tại sao (mà tôi nghĩ là đáng nói đến).

Lý do bạn cần làm điều này là do javascript gán đánh giá về phía bên phải của dấu hai chấm ở bên trái. Để đánh giá bên phải nó cần chạy hàm của bạn trước. Tuy nhiên, nếu bạn có một hàm ẩn danh ở bên phải, nó định nghĩa chính hàm đó làm giá trị của tham chiếu ở phía bên trái (trong javascript giá trị của một biến có thể là một hàm) và gán hàm như bên trái bên (mà bây giờ là một tham chiếu đến hàm). Vì vậy, nó trì hoãn việc đánh giá (chạy hàm) cho đến khi cuộc gọi ajax của bạn hoàn tất.

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