我有一个奇怪的问题。

我需要将对象添加到数组,并且使用普通的array.push(object)似乎不起作用(什么也没做)。

推送发生在parse.com查询中的内部和外部for循环中。

我尝试了一些调试,所有步骤上的console.log都按预期返回了结果。

我的问题是:关于parse.com查询与array.push或for循环有关的工作方式,我是否不知道?任何帮助,将不胜感激。

细节是实体(数组)和实体(对象)。

我希望得到这样的结果:

entities = [
    { url: '/first', changefreq: 'weekly', priority: 1.0 },
    { url: '/second', changefreq: 'monthly', priority: 0.9 },
    { url: '/third', changefreq: 'weekly', priority: 0.5 }
];


但是我只有第一个推动出现在数组中。

我已经检查了所有parse.com查询,它们确实返回了我需要并在以下示例中使用的数据。

我的代码:



module.exports = {
  getSitemap: function(callback) {
    "use strict";
    var Page = Parse.Object.extend('Page'),
      pageQuery = new Parse.Query(Page),
      Article = Parse.Object.extend('Article'),
      articleQuery = new Parse.Query(Article),
      Profile = Parse.Object.extend('Profile'),
      profileQuery = new Parse.Query(Profile),
      Category = Parse.Object.extend('Category'),
      categoryQuery = new Parse.Query(Category),
      entities = [],
      entity = {},
      i,
      sitemap;

    entity.url = '/';
    entity.changefreq = 'weekly';
    entity.priority = 1.0;
    entities.push(entity);
    entity = {};

    articleQuery.equalTo('published', true);
    articleQuery.select("permalink");
    articleQuery.find().then(function(results) {
      for (i = 0; i < results.length; i += 1) {
        entity.url = '/article/' + results[i].get('permalink');
        entity.changefreq = 'monthly';
        entity.priority = 0.9;
        entities.push(entity);
        entity = {};
      }
    }, function(error) {
      // do nothing
    });

    pageQuery.select("pagePermaLink");
    pageQuery.find().then(function(results) {
      for (i = 0; i < results.length; i += 1) {
        entity.url = '/page/' + results[i].get('pagePermaLink');
        entity.changefreq = 'monthly';
        entity.priority = 0.7;
        entities.push(entity);
        entity = {};
      }
    }, function(error) {
      // do nothing
    });

    profileQuery.select("objectId");
    profileQuery.find().then(function(results) {
      for (i = 0; i < results.length; i += 1) {
        entity.url = '/author/' + results[i].id;
        entity.changefreq = 'monthly';
        entity.priority = 0.6;
        entities.push(entity);
        entity = {};
      }
    }, function(error) {
      // do nothing
    });

    categoryQuery.select("categoryPermaLink");
    categoryQuery.find().then(function(results) {
      for (i = 0; i < results.length; i += 1) {
        entity.url = '/category/' + results[i].get('categoryPermaLink');
        entity.changefreq = 'weekly';
        entity.priority = 0.5;
        entities.push(entity);
        entity = {};
      }
    }, function(error) {
      // do nothing
    });

    sitemap = sm.createSitemap({
      hostname: 'http://brianemilius.com',
      cacheTime: 300000,
      urls: entities
    });
    sitemap.toXML(function(err, xml) {
      if (err) {
        callback({
          error: err
        });
      }
      callback(xml);
    });
  }
};

最佳答案

该代码将启动多个异步操作,然后立即执行依赖于其结果的操作。我们需要修改代码以等待每个操作完成。

// ...
// above here from the OP

articleQuery.equalTo('published', true);
articleQuery.select("permalink");
// hang on to the promise
var articlePromise = articleQuery.find().then(function(results) {
  for (i = 0; i < results.length; i += 1) {
    entity.url = '/article/' + results[i].get('permalink');
    entity.changefreq = 'monthly';
    entity.priority = 0.9;
    entities.push(entity);
    entity = {};
  }
}, function(error) {
  // do nothing
});

pageQuery.select("pagePermaLink");
// hang on to the promise
var pagePromise = pageQuery.find().then(function(results) {
  for (i = 0; i < results.length; i += 1) {
    entity.url = '/page/' + results[i].get('pagePermaLink');
    entity.changefreq = 'monthly';
    entity.priority = 0.7;
    entities.push(entity);
    entity = {};
  }
}, function(error) {
  // do nothing
});

profileQuery.select("objectId");
// hang on to the promise
var profilePromise = profileQuery.find().then(function(results) {
  for (i = 0; i < results.length; i += 1) {
    entity.url = '/author/' + results[i].id;
    entity.changefreq = 'monthly';
    entity.priority = 0.6;
    entities.push(entity);
    entity = {};
  }
}, function(error) {
  // do nothing
});

categoryQuery.select("categoryPermaLink");
// hang on to the promise
var categoryPromise = categoryQuery.find().then(function(results) {
  for (i = 0; i < results.length; i += 1) {
    entity.url = '/category/' + results[i].get('categoryPermaLink');
    entity.changefreq = 'weekly';
    entity.priority = 0.5;
    entities.push(entity);
    entity = {};
  }
}, function(error) {
  // do nothing
});

// only after all of the promises that create entities are fulfilled
// do we execute the logic that relies on that data

var promises = [articlePromise, pagePromise, profilePromise, categoryPromise];
Parse.Promise.when(promises).then(function() {
    sitemap = sm.createSitemap({
      hostname: 'http://brianemilius.com',
      cacheTime: 300000,
      urls: entities
    });
    sitemap.toXML(function(err, xml) {
      if (err) {
        callback({
          error: err
        });
      }
      callback(xml);
    });
}, function(error) {
    // handle error
});

10-04 17:38