返回新的Promise()在Node.js中不起作用

时间:2016-11-06 03:50:01

标签: javascript node.js promise

我对promises的概念以及JavaScript的新概念都是新的。我试图在Node.js中编写一个函数,我可以将URL传递给结果的承诺。

我已经将它编程为两种方式。第一个不起作用,我可以将URL传递给函数。第二个确实有效,其中URL是静态定义的。第一个不起作用,因为编译器不认为它是一个函数,由于某种原因我无法弄清楚,为什么?

由于函数getJson不被Node解释为函数,所以这样做是可行的:

var options = { method: 'GET',
                url: URL,  // This will be dynamically filled by the argument to the function getJson
                headers: { authorization: 'OAuth realTokenWouldBeHere', Accept: 'application/json' } };

var getJson = function(URL){

  return new Promise(function(resolve, reject) {

    request(options, function (error, response, body) {
      if(error) reject(error);
      else {
        resolve(JSON.parse(body));  //The body has an array in the jason called Items 
      }
    });
  });  // Edited original post. Had two curly braces }}; here by accident, which was why function was not being recognized
};  

getJson.then(function(result) {
  console.log(result.Items); // "Stuff worked!"
}, function(err) {
  console.log(err); // Error: "It broke"
});

这种方式可行,我将一个项目阵列带回到控制台。这样做的缺点是使用的URL是静态的。我想要做的是通过获取API的结果链接一堆URL,一个URL调用然后包含结果的NextPage的URL。

var options = { method: 'GET',
  url: 'http://staticURL',
  headers: { authorization: 'OAuth realTokenWouldBeHere', Accept: 'application/json' } };

var getJson = new Promise(function(resolve, reject) {
  request(options, function(err, response, body) {
    if(err) reject(err);
    else {
      resolve(JSON.parse(body));
    }
  });
});

getJson.then(function(result) {
  console.log(result.Items); // "Stuff worked!"
}, function(err) {
  console.log(err); // Error: "It broke"
});

3 个答案:

答案 0 :(得分:4)

试试这个:

var getJson = function(URL){
  var options = { 
    method: 'GET',
    url: URL,
    headers: { authorization: 'OAuth realTokenWouldBeHere', Accept: 'application/json' } 
  };
  return new Promise(function(resolve, reject) {

    request(options, function (error, response, body) {
      if(error) reject(error);
      else {
        resolve(JSON.parse(body));
      }
    });
  }};
};  

然后你可以称之为:

getJson(theDynamicURLGoesHere).then(function(result) {
  console.log(result.Items); // "Stuff worked!"
}, function(err) {
  console.log(err); // Error: "It broke"
});

答案 1 :(得分:2)

getJson.then(...)
第一个代码块中的

不正确。它必须是:

getJson(someURL).then(...)

因为在第一个代码块中,getJson是一个函数,所以你必须调用它来执行它,你需要传递它所需的参数。

在您的第一个代码块中,getJson是一个函数,当您调用并执行函数时返回一个promise,因此您必须调用该函数才能获得承诺。在第二个代码块中,getJson已经是一个promise,因此您可以调用getJson.then(...)

答案 2 :(得分:0)

getJson()是一个函数,因此您需要使用()来调用它:

getJson(URL).then(onFulfilled, onRejected);

要注意的重要一点是,create a new promise using a constructor是您的承诺,是一个对象。不要尝试将Promise用作函数-Promise立即开始执行,.then()只是注册一个事件处理程序,以便您在Promise更改状态时得到通知。