2013-06-05 2 views
0

jQuery $ .ajax를 사용하여 데이터베이스에 직접 요소를 추가하고 있습니다.

서버 측에서 최근에 추가 한 요소의 ID를 반환하고 완료 이벤트 블록에서 캡처하려고합니다.

 if(!key) { 
      $.ajax({ 
       url: "/tags/add", 
       type: "GET", 
       data: {tagName:value} 
      }).done(function(data){ 
       key = data; 
      }); 
     } 

/태그/추가 반환 :

return new Response($tags[0]->getId(), 200, array('Content-Type' => 'text/html'));

응답 프레임 워크 다릅니다. 나는 URL/태그에 가면

/추가? 태그 이름 = 123

이 존재하지 않는 경우 데이터베이스에 해당 태그를 추가하려고합니다. 성공하면 id를 반환합니다. 반환

63하지만, 수행 기능에 위의 예에서

여기 캐치의 63 (또는 어떤 숫자가) 것을 잡는 것 같지 않습니다.

의 존재하지 않는 dogs 태그 가정 해 봅시다 : 나는 완료 내부의 첫 번째 줄에 console.log(data)을 할 경우

1) /tags/add?tagName=dogs 데이터베이스에 dogs를 추가하며, ID를 64

2를 반환됩니다) (태그가 존재하지 않는 경우 기본 ID) 나 데이터베이스에 다시 dogs 태그를 추가하려고하면 /tags/add?tagName=dogsdogs이 이미 존재하는 것을 볼 수

3) 이벤트 블록, 그것은, 0를 기록합니다 만 다시에서 해당 ID (64)

4) 다음 console.log(data) 차기를 반환, 그리고 64

이유가 일어나고있는 모든 아이디어를 기록 할 것인가?

+0

'데이터'값은 서버의 응답입니다. 그것이 당신이 기대하는 바가 아니라면 문제는 서버 측 코드와 비슷하게 들린다. –

+0

그게 내가 생각한 것도 있지만 URL로 직접 이동하면 서버 측 응답이 정확합니다. – ILikeTacos

+1

tagname이 없으면 새로 삽입 된 ID 또는 0을 반환해야합니까? 여기서 문제가 어디인지 이해하지 못합니다 –

답변

0

문제는 ajax의 비동기 특성 때문이었습니다.

done 블록 외부에서 올바르게 서버 응답을 캡처하려면 모두 async을 false로 설정해야했습니다.

if(!key) { 
     $.ajax({ 
      async: false, 
      url: "/tags/add", 
      type: "GET", 
      data: {tagName:value} 
     }).done(function(data){ 
      key = data; 
     }); 
    } 
+0

'async : false'는 옳은 대답이 아닙니다. 지연된 메소드로 처리하기로되어 있지도 않습니다. – Alnitak

+0

async의 결과를 이해합니다 : false, 기본적으로 서버가 스크립트에 응답하지 않으면 서버가 기다릴 때까지 기다립니다. – ILikeTacos

+0

예, 그렇습니다. 'return'을 사용하지 않는 방법이 항상 있습니다. – Alnitak