2017-06-24 1 views
3

J'utilise fetch pour obtenir des données json d'une API. Fonctionne bien mais je dois l'utiliser à plusieurs reprises pour divers appels, donc il doit être synchrone ou bien j'ai besoin d'un moyen de mettre à jour l'interface lorsque l'extraction se termine pour chaque composant.Comment rendre javascript fetch synchrone?

function fetchOHLC(yUrl){ 
    fetch(yUrl) 
    .then(response => response.json()) 
    .then(function(response) { 
       alert(JSON.stringify(response.query)); 

      var t = response.created; 
      var o = response.open; 
      var h = response.high; 
      var l = response.low; 
      var c = response.close; 

     return {t,o,h,l,c}; 

    }) 
    .catch(function(error) { 
     console.log(error); 
    });  
} 

var fetchData = fetchOHLC(yUrl); 
alert(fetchData); // empty ? 

Existe-t-il un autre moyen d'y parvenir autre que l'utilisation de fetch? (Je ne veux pas utiliser jquery de préférence).

Merci

Modifier

La question est sur fetch-api, n'ajax, jquery pas, alors s'il vous plaît marquer l'arrêter comme doublon de ces questions sans le lire correctement. Et si vous vous sentez toujours obligé de le faire, s'il vous plaît arrêter de le lier à des questions et réponses de dix ans, beaucoup de changements dans une décennie.

+1

@Igor non, son différent, plz essayer d'atteindre les deux questions correctement avant de les marquer comme des doublons –

+1

J'ai lu la question et il est un doublon. Vous ne comprenez pas comment obtenir/utiliser un résultat d'un appel asynchrone, les deux dernières lignes de votre exemple le rendent très évident. Lisez les réponses fournies pour mieux comprendre comment utiliser les réponses des appels asynchrones, elles sont bien écrites et peuvent vous aider à résoudre votre problème. – Igor

+1

@Igor veuillez lire la réponse fournie par jonas sur cette question pour voir comment il a compris la question et y a répondu correctement :) J'espère que cela vous aidera à effacer vos concepts et vous faire comprendre comment ajax, fetch et jquery sont des choses différentes, –

Répondre

6

Vous voulez que votre qude retourner STH:

function fetchOHLC(yUrl){ 
    return fetch(yUrl) 
    .then(response => response.json()) 
    .then(function(response) { 
      alert(JSON.stringify(response.query)); 

     var t = response.created; 
     var o = response.open; 
     var h = response.high; 
     var l = response.low; 
     var c = response.close; 

    return {t,o,h,l,c}; 

    }) 
    .catch(function(error) { 
     console.log(error); 
    });  
} 

Maintenant fetchData contient une promesse, qui peut être facilement utilisé:

var fetchData = fetchOHLC(yUrl); 
fetchData.then(alert); //not empty ! its {t,o,h,l,c} 

Si vous voulez un peu de fantaisie ES7, vous pourrait réécrire le tout comme ceci:

async function fetchOHLC(yUrl){ 
    try{ 
    var r=JSON.parse(await fetch(yUrl)) 
    alert(JSON.stringify(r.query)); 
    return {t:r.created,o:r.open,h:r.high,l:r.low,c:r.close}; 
    }catch(e){console.log(e);} 
} 

(async function(){ 
    var fetchData = await fetchOHLC(yUrl); 
    alert(fetchData); 
})() 
+0

Pourquoi utilisons-nous deux fois le retour? –

+0

oh ok, désolé j'ai raté que le retour dans la fermeture revient à chercher seulement pas fetchOHLC –

+1

@NabeelKhan non il retourne dans la chaîne de la promesse. Donc, il résout la promesse retournée par alors avec ça. C'est pourquoi ive retourné cette promesse, de sorte que vous pouvez obtenir les données complètes ... –