Я пишу приложение NodeJS, которое будет загружать данные из базы данных, анализировать их, а затем сохранять проанализированный результат в другой таблице базы данных. Вот что у меня есть на данный момент:
parse(index, from, to) {
var collection = this.getCollectionName();
var interval = global.Settings.Parser.ParseInterval;
var promises = [];
console.log('%d - %d', from, from + interval);
for(from; from < to; from += interval) {
promises.push(new Promise((resolve, reject) => {
var scoped = from;
this.data.query(collection, {[index]: { $gte: from, $lte: from + interval}, (result) => {
for(var i = 0; i < result.length; i++)
this.sendToBuilder(result[i]);
resolve();
});
}));
}
promises.reduce((promise) => {
Promise.resolve()
});
}
Код, кажется, делает то, что должен, но поскольку запрос к базе данных является асинхронным, кажется, что нарушение порядка является обычным явлением. Я не хочу, чтобы это произошло. Я хочу, чтобы каждый запрос и обещание выполнялись последовательно, чтобы поддерживать порядок данных.
Я пытаюсь использовать метод array.reduce()
, чтобы попытаться связать каждое обещание для последовательного выполнения, но из-за природы обещаний он просто запускает обещание и продолжает работу, заставляя их все срабатывать одновременно.
Как я могу гарантировать, что он будет выполняться последовательно? Я не возражаю против задержек между каждым обещанием, если это не блокирует фактический поток.
interval
установлено значение 1000, я бы хотел, чтобы он запускал запрос, вызывалsendToBuilder()
, а затем запускал следующий. - person w0f   schedule 10.02.2018await
внутри вашего цикла, но мне нужно знать, какую базу данных вы используете (чтобы использовать для нее интерфейс на основе обещаний), и является лиthis.sendToBuilder()
асинхронным или нет, и если это асинхронный, как вы узнаете, когда это будет сделано. - person jfriend00   schedule 10.02.2018DataClient
, в которой есть очередь, в которой хранятся запросы и другие операции во время подключения к базе данных. Когда соединение завершено, очередь выполняется. - person w0f   schedule 10.02.2018this.sendToBuilder()
асинхронным? Если да, то как узнать, что он завершен? - person jfriend00   schedule 10.02.2018this.data.query()
не можете сообщить об ошибке. - person jfriend00   schedule 10.02.2018sendToBuilder()
- это просто функция форматирования, которая допускает полиморфизм класса ES6, когда данные из нескольких источников могут быть проанализированы с помощью наследующего класса, форматирующего данные в общем виде.this.data.query()
— это функция-оболочка, которая выдает ошибку, если она присутствует. - person w0f   schedule 10.02.2018