web-dev-qa-db-fra.com

extraction de noeud ne renvoyant que la promesse en attente

J'essaie node-fetch et le seul résultat que j'obtiens est:

Promise { <pending> }

Comment puis-je résoudre ce problème afin d'obtenir une promise complétée?

code:

var nf = require('node-fetch');

nf(url).then(function(u){console.log(u.json())})
7
Liondancer

Le problème avec votre code est que u.json () renvoie une promesse

Vous devez également attendre que cette nouvelle promesse soit résolue:

var nf = require('node-fetch');

var url = 'https://api.github.com/emojis'

nf(url).then(
  function(u){ return u.json();}
).then(
  function(json){
    console.log(json);
  }
)

Pour du code réel, vous devez également ajouter un fichier .catch ou try/catch et une gestion d'erreur 404/500 car l'extraction réussit toujours sauf si une erreur réseau se produit. Les codes d'état 404 et 500 sont toujours résolus avec succès

11
stujo

Une promesse est un mécanisme permettant de suivre une valeur qui sera attribuée ultérieurement. 

Avant que cette valeur ait été attribuée, une promesse est "en attente". C'est généralement comme cela qu'il devrait être renvoyé à partir d'une opération fetch(). Il doit généralement être en attente à ce moment-là (il peut y avoir quelques circonstances dans lesquelles il est immédiatement rejeté en raison d'une erreur, mais la promesse est généralement initialement en attente. À un moment donné, elle sera résolue ou rejetée. Pour être averti lorsque le problème est résolu ou rejeté, utilisez soit un gestionnaire .then(), soit un gestionnaire .catch().

var nf = require('node-fetch');

var p = nf(url);

console.log(p);   // p will usually be pending here

p.then(function(u){
    console.log(p);     // p will be resolved when/if you get here
}).catch(function() {
    console.log(p);     // p will be rejected when/if you get here
});

Si c'est la méthode .json() qui vous a confondu (aucune idée compte tenu du libellé peu clair de votre question), alors u.json() renvoie une promesse et vous devez utiliser .then() sur cette promesse pour obtenir la valeur que vous pouvez utiliser de l'une des manières suivantes:

var nf = require('node-fetch');

nf(url).then(function(u){
   return u.json().then(function(val) {
      console.log(val);
   });
}).catch(function(err) {
    // handle error here
});

Ou, avec moins de nidification:

nf(url).then(function(u){
   return u.json()
}).then(function(val) {
      console.log(val);
}).catch(function(err) {
    // handle error here
});

Il existe un exemple de code exact pour cela sur la page de documentation pour node-fetch . Vous ne savez pas pourquoi vous n'avez pas commencé avec ça.

6
jfriend00

u.json() renvoie une promesse, vous devez donc le faire.

nf(url)
.then(function(u){ 
    return u.json();
})
.then(function(j) { 
    console.log(j); 
});

ou que vous utilisez noeud

nf(url).then(u => u.json()).then(j => console.log(j));
1
Jaromanda X