node.js + for循环+查询执行

Sub*_*raj 4 javascript node.js

我正在执行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);
Run Code Online (Sandbox Code Playgroud)

我需要的是我希望在for循环中执行的所有查询之后打印数组.但现在它在阵列之前的打印已经填充.帮我解决这个问题.提前致谢..

bry*_*mac 6

原因是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
});
Run Code Online (Sandbox Code Playgroud)

注意还有forLachLimit用于并行执行n和forEachSeries,其限制为1(顺序).

编辑:

更好的选择是async/await,如果你使用typescript并编译成ES6 +并使用node 4+(有生成器),现在可以使用async/await.

我在这个理智的节点回购中介绍了细节

来自该repo的片段显示在循环中等待异步调用.它保持异步,并且在完成之前不会进入下一行.这也有你想象的try/catch处理的好处.

// 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;
Run Code Online (Sandbox Code Playgroud)