2016-12-14 1 views
1

Je commence avec réagir natif, et je fais l'exemple classique dans la documentation comme base ...Obtenez JSON jsonp chercher promesse

fetch('https://facebook.github.io/react-native/movies.json') 
    .then((response) => response.json()) 
    .then((responseJson) => { 
    return responseJson.movies; 
    }) 
    .catch((error) => { 
    console.error(error); 
    }); 

Tout cela fonctionne très bien avec JSON en bonne cet exemple.

Cependant, dans mon cas particulier, la seule réponse API disponible est JSONP et non JSON. Aucun JSON de base n'est disponible. Donc, je reçois une erreur sur le « (».

Au lieu de JSON comme

{"id": "1", "movies" : [ { "id" : "123" } ] } 

Je reçois JSONP comme

?({"id": "1", "movies" : [ { "id" : "123" } ] }); 

Cependant, je ne suis pas sûr ce que je peux faire pour le JSON hors de ceci via les promesses d'extraction? Comment puis-je manipuler la réponse avec une de mes propres fonctions, ou est-ce qu'il y a une manière plus normale?

Ainsi dans le premier alors() je ne sais pas ce que je peux faire obtenir o ut the json (J'ai essayé d'opérer sur la réponse, mais cela semble juste tenir compte de la promesse, donc je ne sais pas comment réagit natif fetch fonctionne avec cela).

+0

Merci pour le downvote, serait utile de dire pourquoi, pour que je puisse l'améliorer. – Ian

Répondre

3

Je suggère d'utiliser response.text() au lieu de response.json(), de supprimer le bruit environnant, puis d'analyser la chaîne JSON.

fetch('YOUR URL HERE') 
 
     .then((response) => response.text()) 
 
     .then((responseText) => { 
 
      const match = responseText.match(/\?\((.*)\);/); 
 
      if (! match) throw new Error('invalid JSONP response'); 
 
      return JSON.parse(match[1]).movies; 
 
     }) 
 
     .catch((error) => { 
 
      console.error(error); 
 
     });

+0

Merci, très utile. – Ian