在parse.com查询中将对象添加到数组

时间:2016-01-31 17:34:39

标签: javascript arrays parse-platform javascript-objects

我有一点奇怪的问题。

我需要将对象添加到数组中,并且使用普通array.push(object)似乎不起作用(没有任何内容被推送)。

在parse.com查询中,for-loops内外都会发生推送。

我已经尝试了一些调试,并且所有步骤上的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);
    });
  }
};
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:2)

代码启动了几个异步操作,然后立即采取依赖于其结果的操作。我们需要修改代码以等待每个操作完成。

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