node.js+用于循环+查询执行

node.js + for loop + query execution

本文关键字:查询 执行 循环 js+ 用于 node      更新时间:2023-09-26

我正在执行for循环,在for循环中,我正在执行postgresql查询并将结果填充到数组中。但我无法预测执行流程。

我的代码:

var array =[];
       for(var i = 0 ; i< latitude.length; i++){       
    client.query("SELECT value->>'xxxx' as xxxx_details FROM yyyyy WHERE ST_DWithin(ST_GeogFromText('SRID=4326;POINT ("+latitude[i]+" "+longitude[i]+")'), geography(the_geom), " + radius + ")", function(err, row, fields) {               
                       array.push(row.rows[0]);
       }   
                console.log("bbbbbbbbb=" +array);

我需要的是在for循环中执行完所有查询后打印数组。但现在它在数组填充之前进行打印。帮我解决这个问题。提前谢谢。。

原因是client.query是异步的,结果只在回调中可用。

一个选项是async.js。很好地编写何时使用此处的内容。

从那篇文章中,您可以为集合中的每个项执行代码。因此,对于您的示例,您可以使用一个索引数组或foreach来构建一个sql查询语句数组,然后为每个查询执行一些语句。

如果查询是一个查询数组,那么类似于:

async.forEach(queries, function(query, callback) {
    client.query(query, function(err, row, fields){
        array.push(row.rows[0]);
        callback(); // this signals async that you're done with this item
    });
}, function(err) {
    if (err) return next(err);
    // all queries are done here
});

注意,还有forEachLimit用于并行执行n,以及forEachSeries,它的极限为1(顺序)。

编辑:

一个更好的选择是async/await,如果您使用typescript并编译到ES6+并使用node4+(具有生成器),则现在可以使用它。

我介绍了这个健全节点回购中的细节

该repo中的一个片段显示在循环中等待异步调用。它使它保持异步,并且在完成之前不会前进到下一行。这也有尝试/捕获处理的好处,正如你所期望的那样

// await allows us to write linear code.  
// makes it easy to also call async code in a loop
// offers easy error handling with try catch
var quotes: IQuote[];
var tries: number = 0;
while (true) {
    try {
        ++tries;
        // ASYNC/AWAIT
        quotes = await this._store.find<IQuote>({});
        break;
    }
    catch (err) {
        if (tries == 3) { throw err; }
    }
}
return quotes;