首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点for循环保持循环

节点for循环保持循环
EN

Stack Overflow用户
提问于 2018-12-26 20:09:39
回答 1查看 44关注 0票数 1

我使用请求读取一个网站,然后parseString转换,然后保存为json。问题是存钱。看起来"for循环“不断循环,当保存信息时,使用var cta中的最后一个信息来分配信息。我曾经尝试过等待,但它没有起作用。提前谢谢。

代码语言:javascript
复制
var fs      = require('fs');
var request = require('request');
var parseString = require('xml2js').parseString;

var json = {} ;

var cta = [
  {
    "_id": 1,
    "name": "PRWeb",
    "feedtype": "Misc",
    "feedaddress": "https://www.prweb.com/rss2/daily.xml",
    "status": true
  },
  {
    "_id": 2,
    "name": "Business Wire",
    "feedtype": "Industrie",
    "feedaddress": "https://feed.businesswire.com/rss/home/?rss=G1QFDERJXkJeGVtRVQ==",
    "status": false
  },
  {
    "_id": 3,
    "name": "News Wire",
    "feedtype": "Daily News",
    "feedaddress": "https://www.newswire.com/newsroom/rss/custom/all-press-releases",
    "status": true
  }
];

for (var i = 0; i < cta.length; i++) { 

  function getDatos(url, callback) {
      request(url, function(error, response, data){
          callback(error, response, data);
      });
  }

  if (cta[i].status === true) {
      console.log("cta: " + cta[i].feedaddress);

      agrabar = cta[i];
      console.log("agrabar:  " + agrabar.feedaddress);
      getDatos(agrabar.feedaddress, function(error, response, data){

           parseString(data, {explicitArray: false}, function (err, result) {
              if (err) {
                  return console.log('unable to parse XML');
              }

              json = {rssfeeder: agrabar, feed: result.rss.channel.item};
              console.log(json);
              fs.appendFile ("output.json", JSON.stringify(json, null, 4), function(err) {
              if (err) throw err;
              console.log('complete');
              });
          });
       });
  }

}
console.log('DONE!!!')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-26 21:24:18

您似乎将异步代码与同步代码混合在一起。如果您能读到更多关于Javascript中如何处理回调(以及按什么顺序处理)的内容,那就太好了。

示例:您的最后一行代码console.log('DONE!!!')实际上应该在最后一行打印完毕,但当您运行它时,您会感到惊讶的是,它实际上是第一行打印到控制台。这是因为函数getDatos是一个异步函数,这意味着它将在以后的某个时间点执行。您的for循环同步执行,这意味着getDatos将以正确的顺序被调用三次,但是由于JS中的函数闭包和异步性,getDatos将在您的最终console.log完成后被调用。

此外,在现代JS中使用async awaitPromises是一个很好的实践,因为它使阅读代码更加容易。我已经修改了你的代码来做你想做的事情,就在这里。希望能帮上忙!

代码语言:javascript
复制
var fs      = require('fs');
var request = require('request');
var parseString = require('xml2js').parseString;

var cta = [
    {
        "_id": 1,
        "name": "PRWeb",
        "feedtype": "Misc",
        "feedaddress": "https://www.prweb.com/rss2/daily.xml",
        "status": true
    },
    {
        "_id": 2,
        "name": "Business Wire",
        "feedtype": "Industrie",
        "feedaddress": "https://feed.businesswire.com/rss/home/?rss=G1QFDERJXkJeGVtRVQ==",
        "status": false
    },
    {
        "_id": 3,
        "name": "News Wire",
        "feedtype": "Daily News",
        "feedaddress": "https://www.newswire.com/newsroom/rss/custom/all-press-releases",
        "status": true
    }
];

function getDatos(cta_object) {
    if (cta_object.status === false){
        return new Promise((resolve, reject) => resolve(false));
    }
    else {
        return new Promise((resolve, reject) => {
            request(cta_object.feedaddress, (err, response, data) => {
                if (err) reject(err);
                else resolve(data);
            })
        })
            .then((data) => {
                return new Promise((resolve, reject) => {
                    parseString(data, {explicitArray: false}, (err, result) => {
                        if (err) {
                            console.error("Unable to parse XML!");
                            return reject(err);
                        }
                        else return resolve(result);
                    });
                })
            })
            .then((result) => {
                console.log(result);
                return {
                    'rssfeeder': cta_object,
                    'feed': result.rss.channel.item
                };
            })
            .then((json) => {
                return new Promise((resolve, reject) => {
                    fs.appendFile ("output.json", JSON.stringify(json, null, 4), function(err) {
                        if (err) reject(err) ;
                        console.log("complete!");
                        resolve(true);
                    });
                })
            })
            .catch((err) => {
                throw(err);
            })
    }
};

Promise.all(cta.map((cta_obj) => getDatos(cta_obj)))
    .then(() => console.log('DONE!!!'))
    .catch((err) => {
        throw err;
    })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53936650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档