我正在编写一个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()
方法尝试将每个承诺链接到顺序执行,但由于Promises的性质,它只是启动承诺并继续,同时使它们同时发生。
如何确保它会按顺序执行?我不介意每个承诺之间的延迟,只要它不阻止实际的线程。
答案 0 :(得分:0)
以下是使用async / await:
的代码精神的工作示例
function getData(reqId, collection, index, gte, lte) {
return new Promise((resolve, reject) => {
const delay = Math.floor(Math.random() * 2000) + 1;
console.log(`[getData ${reqId}] delay: ${delay}`);
const params = { collection, [index]: { $gte: gte, $lte: lte } };
const results = [0, 1, 2].map(r => `result ${reqId}.${r}`);
setTimeout(() => {
console.log(`[getData ${reqId}] this.data.query(${JSON.stringify(params)})`);
resolve(results);
}, delay);
});
}
async function parse(index, from, to) {
const collection = 'My Collection';
const interval = 10;
console.log(`Processing ${from} to ${to} by ${interval}:`);
for (from; from <= to; from += interval) {
const reqId = from;
console.log(`[parse] BEGIN ${reqId}`);
const results = await getData(reqId, collection, index, from, from + interval);
results.forEach(result => {
console.log(`[parse - awaited ${reqId}] this.sendToBuilder(${result})`);
});
console.log(`[parse] END ${reqId}`);
}
}
parse('idx', 200, 250);