NodeJS:按顺序和异步解析数据

时间:2018-02-09 21:15:52

标签: javascript node.js asynchronous sequential

我正在编写一个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的性质,它只是启动承诺并继续,同时使它们同时发生。

如何确保它会按顺序执行?我不介意每个承诺之间的延迟,只要它不阻止实际的线程。

1 个答案:

答案 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);

相关问题