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