svelte에서 비동기 대기(#await)를 사용하면 나중 함수 호출에서 형식화된 원하는 데이터가 반환되지 않습니다
svelte에서 비동기 대기(#await)를 사용하면 나중 함수 호출에서 형식화된 원하는 데이터가 반환되지 않습니다
나는 현재 JSON을 반환하지 않는 API로 작업하고 있다. 이 문제를 해결하기 위해, 나는 응답을 가져와 배열에 푸시한다(입력을 제거하고 응답의 각 숫자를 분할하기 위해 형식을 지정하는 동안). 그런 다음 이 183개의 숫자 배열을 사용하고 183개의 문자가 있는 배열에 대해 for 루프를 실행하여 응답에서 (사용자 지정 키 값 쌍이 있는) 개체를 생성합니다.
상황이 혼란스러워지는 것은 내가 HTML의 데이터를 사용하기 시작할 때이다. 보통 당신은 그냥 말할 수 있지만 나는 개체가 정의되지 않았다는 오류를 겪고 있다. 함수가 실행될 때까지 생성되지 않았기 때문에 이해할 수 있습니다.
해결책을 찾은 후, 나는 스벨트 대기 블록을 우연히 발견했다. 여기에서 해당 내용을 읽고 튜토리얼을 확인할 수 있습니다:
이 기능을 구현하려고 시도한 결과 다음 코드가 있습니다:
let playerStats = []
let proxy = "https://cors-anywhere.herokuapp.com/"
let url = proxy + "https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player=Hess"
const data = {};
let promise = getPlayer();
async function getPlayer() {
return await fetch(url).then((response) => response.text())
.then((data) => {
return data;
});
}
getPlayer().then((playerData) => {
// format data
playerStats.push(playerData.replace(/\n/ig, ",").split(','));
console.log(playerStats);
// Begin object generation
// names array shortened
let names = ["overallRank", "overallLvl", "overallXP", "attRank", ]
const data = {};
for (var i = 0; i < playerStats[0].length; i++) {
data[names[i]] = playerStats[0][i];
}
console.log(data);
});
<main>
{#await promise}
<p>Search for a Player...</p>
{:then data}
<p>The data is {data}</p>
{/await}
</main>
- 나는 당신이 여기서 찾을 수 있는 스블렛 편집기에 이 코드를 던지는 것을 제안한다:
이 코드의 문제는 에서 데이터를 출력하고 개체가 아닌 포맷되지 않은 데이터를 반환한다는 것입니다.
두 번째 기능 이후에 생성된 개체를 반환하여 HTML 전체에서 해당 개체를 사용할 수 있도록 합니다.
제가 잘 설명해드렸으면 좋겠고 어떤 도움이라도 미리 감사드립니다.
함수에서 반환되는 것이 반환되기 때문에 형식화된 데이터를 반환하는 것입니다. 포맷된 데이터를 얻으려면 체인에 포맷을 추가해야 합니다
async function getPlayer() {
return await fetch(url)
.then((response) => response.text())
.then((playerData) => {
// here your transformation
// do not forget to actually return something
return data;
});
당신은 사실 그것을 분류하는 데 매우 가까웠고, 내가 믿는 약속이 어떻게 작동하는지에 대해 약간 혼란스러웠다.
가져오기 및 디코딩 작업 후 데이터가 처리되는 블록 내에서 데이터를 포맷하기만 하면 됩니다:
async function getPlayer() {
return await fetch(url)
.then((response) => response.text())
.then((data) => {
return formatData(data);
});
}
기능은 기본적으로 이미 존재하며 코드를 약간 변경하면 됩니다:
function formatData(playerData) {
playerStats.push(playerData.replace(/\n/ig, ",").split(','));
console.log(playerStats);
// Begin object generation
// names array shortened
let names = ["overallRank", "overallLvl", "overallXP", "attRank", ]
const data = {};
for (var i = 0; i < playerStats[0].length; i++) {
data[names[i]] = playerStats[0][i];
}
console.log(data);
return data;
}
마지막으로 블록에서 사용하기로 한 약속을 명시적으로 선언할 필요가 없습니다. 약속이 반환되므로 대신 직접 사용할 수 있습니다:
<main>
{#await getPlayer()}
<p>Search for a Player...</p>
{:then data}
<p>Overall Rank: {data.overallRank}</p>
{/await}
</main>