2 votes

JS : Comment résoudre ce problème [Promesse d'objet] ?

J'ai ce problème [object Promise], lorsque j'essaie de charger des citations d'une API à partir de ce fichier https://type.fit/api/quotes . En haut de la page, une fois le chargeur terminé, les citations définies sur la page doivent être chargées. https://type.fit/api/quotes . J'utilise pour cela une fonction asynchrone (await). J'ai la fonction suivante : selectAndReturnRandomQuote, cette fonction appelle loadQuotesFromJSON, qui fait une recherche sur le lien et renvoie les citations, à la fin de la fonction je renvoie l'impression sur la page comme ceci "Citation du jour : " + quote.quoteOfAuthor + " par " + quote.author. Ensuite j'ai uploadQuote, qui en fait avec innerHTML met mon résultat sur la page. Les fonctions sleep et setLoader sont utilisées pour charger la citation avant qu'elle ne soit affichée. Voici mes extraits de code.

"use strict";

async function selectAndReturnRandomQuote() {
    let quotesFromJSON = await loadQuotesFromJSON();
    let quote = quotesFromJSON[Math.floor(Math.random() * quotesFromJSON.length)];

    let result = "Quote of the day: " + quote.text+ " by " + quote.author;
    return result;

}

function uploadQuote(){
    document.getElementById('randomeQuotes').innerHTML = selectAndReturnRandomQuote();
}

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
 }

async function setLoader() {
    document.getElementById('randomeQuotes').innerHTML = "<img src='loader2.gif' width='28px' height='55px'>";
    await sleep(1000);  
    await uploadQuote();
}

setLoader();

async function loadQuotesFromJSON() {
    const response = await fetch('https://type.fit/api/quotes');
    return response.json();
}

div {
    white-space: pre-line;
    margin-bottom: 1px;
    background-color:aliceblue;
    border-radius: 14px;
    opacity:0.83;
    width: 430px;
    position:relative;
    left: 80px;
    border-style: solid;
    border-width: 2.2px;
    border-color:aquamarine;
}

img {
    width: 100px; 
    border-radius: 50px;
    border-style: solid;
    border-width: 2.2px;
    border-color:aquamarine;
}

body {
    font-family: "Comic Sans MS", "Comic Sans", cursive;
    width: 600px;
    margin: auto;
    text-align: center;
    margin-top: 55px;

    background-color:cadetblue;

}

<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Contact form</title>
        <link rel="stylesheet" href="FormExternalStyles.css">
    </head>
    <body>
        <div id = 'randomeQuotes' class = "marginbottom">
        </div>
    </body>
</html>

3voto

Sli4o Points 76
"use strict";

async function selectAndReturnRandomQuote() {
    let quotesFromJSON = await loadQuotesFromJSON();
    let quote = quotesFromJSON[Math.floor(Math.random() * quotesFromJSON.length)];

    let result = "Quote of the day: " + quote.text+ " by " + quote.author;
    return result;

}

async function uploadQuote(){
    document.getElementById('randomeQuotes').innerHTML = await selectAndReturnRandomQuote();
}

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
 }

async function setLoader() {
    document.getElementById('randomeQuotes').innerHTML = "<img src='loader2.gif' width='28px' height='55px'>";
    await sleep(1000);  
    await uploadQuote();
}

setLoader();

async function loadQuotesFromJSON() {
    const response = await fetch('https://type.fit/api/quotes');
    return response.json();
}

div {
    white-space: pre-line;
    margin-bottom: 1px;
    background-color:aliceblue;
    border-radius: 14px;
    opacity:0.83;
    width: 430px;
    position:relative;
    left: 80px;
    border-style: solid;
    border-width: 2.2px;
    border-color:aquamarine;
}

img {
    width: 100px; 
    border-radius: 50px;
    border-style: solid;
    border-width: 2.2px;
    border-color:aquamarine;
}

body {
    font-family: "Comic Sans MS", "Comic Sans", cursive;
    width: 600px;
    margin: auto;
    text-align: center;
    margin-top: 55px;

    background-image: url(pozadinalogin.png);
    background-repeat: no-repeat;
    background-size: 530x 510px;
    background-color:cadetblue;
    background-position: 80px 90px;

}

<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Contact form</title>
        <link rel="stylesheet" href="FormExternalStyles.css">
    </head>
    <body>
        <div id = 'randomeQuotes' class = "marginbottom">
        </div>
    </body>
</html>

Vous avez oublié de définir async et await pour la fonction uploadQuote.

async function uploadQuote(){
    document.getElementById('randomeQuotes').innerHTML = await selectAndReturnRandomQuote();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X