繁体   English   中英

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

[英]return new Promise() not working in Node.js

我对 Promise 的概念以及一般的 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"
});

试试这个:

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"
});
getJson.then(...)

在您的第一个代码块中是不正确的。 它必须是:

getJson(someURL).then(...)

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


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

getJson()是一个函数,所以你需要用()调用它:

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

需要注意的重要一点是,promise 是一个对象,您可以使用构造函数创建一个新的 promise 不要尝试将承诺用作函数 - 承诺立即开始执行, .then()只是注册一个事件处理程序,以便在承诺更改状态时通知您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM