테스트 사이트 - 개발 중인 베타 버전입니다

fetch() 를 함수로 만들 때 콜백처리 방법? 채택완료

도레미 3년 전 조회 2,094

서버의 question.php 에 POST로 데이터를 보내고, 처리된 결과를 answer 로 받으려고 합니다.

fetch() 사용을 함수로 만들어서 사용하고 싶은데 문제가 발생하네요.

 

아래 (2) 번 자리를 alert(result) 로 하면 결과값이 잘 나타납니다.
그런데 이 결과값을 받으려고 여기를 return result; 로 해서 (1) 번에서 받으려고 하면 [object Promise] 로 나타나네요.

 

원하는 것은 (1)번 alert 에서도 (2)을 alert 와 같은 내용이 나와야 합니다.
느낌에 비동기여서 결과값을 받기도 전에 return 해서 그런거 아닐까??... 생각드는데 어떻게 해야할지 모르겠네요..

 

<script>

let data = 'no=123&name=홍길동';

let answer = fetchPost('question.php',data);

alert(answer); //-- (1)</p>

<p> </p>

<p>async function fetchPost(url, data) {

    let response = await fetch(url, {method:'POST', 

        headers: {'Content-Type':'application/x-www-form-urlencoded'},

        body: data});

    if (response.ok) {

      let result = await response.text();

      return result; //-- (2) alert(result);

    }else{

      alert('HTTP-Error: '+ response.status);

    }

}

</script>

 

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트
3년 전
async await도 내부적으로는 promise 객체로 리턴되고 활용됩니다
다만 catch then보다는 그냥 await async로 쓰는게 코드 짜기도 편하기에 지원되는 기능입니다
해당 객체를 async 영역으로 감싸져있지 않은곳에서 받으면 promise 객체로 받을 수 밖에 없습니다
전역, 루트에서는 async를 쓸 수 없기 때문에
</code><script></pre>

<p>(async()=>{</p>

<pre>
<code>let data = 'no=123&name=홍길동';
let answer = await fetchPost('question.php',data);
alert(answer); //-- (1)</code></pre>

<p>})()</p>

<p></script></p>

<p>

이런식으로 활용하세요.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

도레미
3년 전
아~ 감사합니다.
코드와 설명을 이해는 못하겠지만 말씀대로 하니까 작동하네요...ㅎ
코드를 공부해 보겠습니다...^^

댓글을 작성하려면 로그인이 필요합니다.

아르키어드

</p>

<pre>
<code>async function fetchPost(url, data) {
    let response = await fetch(url, {method:'POST', 
        headers: {
            'Content-Type':'application/x-www-form-urlencoded'
        },
            body: data
        }
     )
     .then(res => res.json())
     .catch(e => console.log(e))
}</code></pre>

<p>

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

도레미
3년 전
감사합니다.
그런데 .then .catch 방식 말고 제가 쓴 것 처럼 if (response.ok) else 방식으로 하고 싶어요.
이 방식이 훨씬 직관적이어서...ㅠ

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인