node-fetch只返回promise for pending

时间:2016-12-12 23:28:58

标签: javascript node.js promise

我正在尝试node-fetch,我得到的唯一结果是:

Promise { <pending> }

如何解决此问题,以便我完成promise

代码:

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

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

3 个答案:

答案 0 :(得分:12)

你的代码的问题是u.json()返回一个promise

您还需要等待新的Promise解决:

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);
  }
)

对于实际代码,您还应该添加.catch或try / catch以及一些404/500错误处理,因为除非发生网络错误,否则提取总是成功。状态代码404和500仍然成功解决

答案 1 :(得分:6)

承诺是一种用于跟踪将在未来某个时间分配的值的机制。

在分配该值之前,承诺是&#34;待定&#34;。这通常是从fetch()操作返回的方式。它通常应该处于待处理状态(可能会有一些情况因为某些错误而立即被拒绝,但通常承诺最初将处于未决状态。在未来的某个时刻,它将被解决或拒绝。要在解决或拒绝时收到通知,请使用.then()处理程序或.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
});

如果它是你感到困惑的.json()方法(不知道你的问题措辞不清楚),那么u.json()会返回一个承诺,你必须使用.then()在承诺上获得它的价值,你可以用以下任何一种方式:

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
});

或者,嵌套较少:

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

documentation page for node-fetch上有一个确切的代码示例。不知道为什么你没有从那开始。

答案 2 :(得分:1)

u.json()会返回一个承诺,因此您需要执行此操作

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

或当您使用节点

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