我有一个奇怪的问题。
我需要将对象添加到数组,并且使用普通的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
});