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년 전
댓글을 작성하려면 로그인이 필요합니다.
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 방식으로 하고 싶어요.
이 방식이 훨씬 직관적이어서...ㅠ
그런데 .then .catch 방식 말고 제가 쓴 것 처럼 if (response.ok) else 방식으로 하고 싶어요.
이 방식이 훨씬 직관적이어서...ㅠ
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
코드와 설명을 이해는 못하겠지만 말씀대로 하니까 작동하네요...ㅎ
코드를 공부해 보겠습니다...^^