2016-01-31 2 views
1

У меня возникла странная проблема.Добавить объект в массив внутри запроса parse.com

Мне нужно добавить объекты в массив, и использование нормального array.push(object) не работает (ничего не толкается).

Толчки происходят как внутри, так и снаружи для циклов в запросах parse.com.

Я пробовал некоторые отладки, а console.log на всех шагах возвращает результаты, как я ожидаю.

Мой вопрос:: Есть ли что-то, что я не знаю о том, как запросы parse.com работают в связи с array.push или, может быть, for-loops? Любая помощь будет оценена по достоинству.

Данные являются объектами (массивом) и объектом (объектом).

Я бы ожидать результата что-то вроде:

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

+0

Это может быть полезно прочитать о [JavaScript обещает] (http://blog.parse.com/learn/engineering/whats-so-great-about-javascript-promises/) – Skam

+0

я уже сделал и не нашел ничего, что могло бы объяснить мою проблему. Может быть, вы видите то, чего я не знаю? –

+0

Пожалуйста, console.log (результаты). в обратном вызове. Можете ли вы не получать данные. –

ответ

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 
}); 
+0

Это сделало именно то, что я хотел. Огромное спасибо! –

Смежные вопросы