2015-10-07 16 views
5

Tôi có một trang nơi tôi nhập tên thẻ và chi tiết của thẻ được trình bày qua AJAX. Tôi đã xóa nhiều mã trong ví dụ này không liên quan đến vấn đề này và tôi đã thử nghiệm mã đơn giản này và nó tái tạo cùng một lỗi.Chức năng gọi bên trong đáp ứng thành công jQuery ajax hoạt động một lần nhưng không hai lần

Điều bí ẩn là nó hoạt động tốt trong lần chạy đầu tiên thông qua hàm testSelectedCardDetails. Nó gọi setNameCardIsFromField tiền phạt và làm những gì nó có nghĩa là để làm. Lần thứ hai thông qua nó chết với giao diện điều khiển hiển thị:

Uncaught TypeError: setNameCardIsFromField is not a function 

Có chuyện gì vậy? Tôi thành thật không biết đủ về cách jQuery hoạt động để có thể giải quyết vấn đề vì vậy tôi chuyển sang thế giới stackoverflow để xin ơn cứu độ khỏi sự điên rồ này. ;)

function testSelectedCardDetails(cardName) { 

     var cardTestInfoArray = []; 

     $.ajax({ 
      url: 'includes/getCardAndSetDataViaAJAX.php',   
      type: 'POST', 
      cache: false, 
      async: false, // if set to true then the data doesn't get here fast enough to run commands in 'success' 
      dataType: 'json', 
      data: { callThis: "testSelectedCardDetails", thisCardName: cardName}, 
      error: function(data){ 
       console.log("AJAX failed to get card info."); 
      }, 
      success: function(data) {     

       $.map(data, function (value) { cardTestInfoArray = value; }); 
       cardPresentInfo['printings'] = cardTestInfoArray['printings']; 

       //automatically set setNameCardIsFrom field 
       setNameCardIsFromField(cardPresentInfo['printings']); 
      } 
     }); 
    } 

Đây là chức năng được gọi là:

function setNameCardIsFromField(setCode) { 

     $.ajax({ 
      url: 'includes/getCardAndSetDataViaAJAX.php',   
      type: 'POST', 
      cache: false, 
      async: false, // if set to true then the data doesn't get here fast enough to run commands in 'success' 
      dataType: 'text', 
      data: { callThis: "setNameCardIsFromField", thisSetCode: setCode}, 
      error: function(data){ 
       console.log("AJAX failed to get card info."); 
      }, 
      success: function(setName) { 
       //console.log(setName); 
       setNameCardIsFromField = document.querySelector('#setNameCardIsFrom'); 
       setNameCardIsFromField.value = setName; 
      } 
     }); 
    } 

Trả lời

1

Bạn ghi đè lên các chức năng:

setNameCardIsFromField = document.querySelector('#setNameCardIsFrom'); 

Giả sử nó là toàn cầu (mà nói chung là xấu).

Không liên quan, nhưng meh sử dụng async: false, tốt hơn để làm điều đó đúng hơn là hack xung quanh nó, ví dụ: gọi lại, lời hứa, bất cứ điều gì.

+0

Tôi quá khiêm tốn. Tôi thực sự cần phải học jQuery đúng cách. Ngay bây giờ tôi chỉ cần hack đi hy vọng cho tai nạn hạnh phúc và nhận được thất vọng như thế này quá thường xuyên. Sự cố tôi đã có với async: true, là dữ liệu không đủ nhanh để hoạt động. Tôi đã dành hàng giờ với một vấn đề như thế và khi tôi đặt nó thành 'sai', nó đã sửa nó. Phải làm gì? Tôi muốn làm những việc đúng nhưng ....? – ekendra

+0

@ekendra Truyền một hàm chứa những gì bạn muốn làm vào thành công 'setNameCardIsFromField' và gọi nó trong trình xử lý' success'. –

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