[질문] JavaScript 관련.. 2시간 동안 붙잡고 있어요.... ㅜㅜ

blossom24의 이미지


아래의 코드에서요..

리턴값 받아보면.. undefined로.. 나옵니다..
근데.. 이상한건.. 리턴받아서 .get('xx') 첫 번째에서만 undefined 로 나오고..
두번째 부터는 정상적으로 값을 반환합니다..

뭐가 문제인가요??

그리고 onSuccess 함수 내에서 i 를 인자로 설정하고 함수를 호출하면
첫 번째 부터 정상으로 값을 반환하구요..

2시간 동안 .. 같은 코드만 보고 있었네요.. ㅜㅜ; 도와주세요.

var yy = function() {
  var i = new Hash();
 
  new Ajax.Reqest..(생략)..
    onSuccess: function(res) { 
      ..(생략)..
      i.set('xx', 'xx');
      ..(생략)..
    }
  } // Ajax 끝
 
  return i;
}
iolo의 이미지

"A"jax는 기본적으로 비동기(Async)로 동작합니다.

var yy = function() {
var i = new Hash();

new Ajax.Reqest..(생략)..
onSuccess: function(res) {
..(생략)..
i.set('xx', 'xx');
..(생략)..
}
} // Ajax 끝 <-- 서버로의 요청이 끝났을 뿐... 서버의 응답까지 받은 건 아닙니다.

return i;
}

서버의 응답이 아주 빨리 도착해서 return i 하기 전에 onSuccess 핸들러가 실행되었다면
제대로 된 결과를 얻을 "수"도 있습니다.
두번째 부터 결과가 나온다고 하셨는데... 두번째 yy()의 리턴값은 첫번째 ajax 요청의 결과일 가능성이 큽니다.

결론은,
1) 결과를 받는 부분도 비동기로 처리하거나...
2) 동기(sync)로 호출하면 됩니다.

1)이 좋은 방법이지만, 조금 까다롭고, 귀찮습니다.
2)는 만들기는 쉽지만, ajax답지 못하고... UI가 멈칫하는 문제가 있습니다.

1)을 간단히 해보자면:
var yy = function(callbackFunc) {
var i = new Hash();

new Ajax.Reqest..(생략)..
onSuccess: function(res) {
..(생략)..
i.set('xx', 'xx');
..(생략)..
callbackFunc(i); <--- 서버로 부터 받은 응답을 가공(i)해서 콜백함수에 전달
}
} // Ajax 끝 <-- 서버로의 요청이 끝났을 뿐... 서버의 응답까지 받은 건 아닙니다.

return i;
}
yy(function(ret) {
ret.get('xx') ... <-- 여기서 하고 싶은 일을 한다~
});
여러가지 방법이 있겠습니다만..^^ 제일 단순한게 이거네요.

2)의 경우는 간단합니다.
new Ajax.Reqest..(생략).. { asynchronous: false <-- 요 옵션을 추가해주시면 됩니다.

http://www.prototypejs.org/api/ajax/options 참조하세요

그나 저나... kldp에서 질문에 답변 달아본 게 얼마만인지... ㅎㅎ
----
the smile has left your eyes...

----
the smile has left your eyes...

blossom24의 이미지

아.. 고맙습니다.. ^^;

그렇군요.. return 이 더 빨리 실행되네요..

개념없이 하다보니까.. 이렇게 문제에 부디치네요..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.