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循环中执行的所有查询之后打印数组.但现在它在阵列之前的打印已经填充.帮我解决这个问题.提前致谢..
原因是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)
| 归档时间: |
|
| 查看次数: |
3372 次 |
| 最近记录: |