node.js+用于循环+查询执行
node.js + for loop + query execution
我正在执行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;
相关文章:
- 未捕获的语法错误:无法在“文档”上执行“查询选择器”
- 在node.js-mysql中执行UPDATE查询不起作用
- onchange选择get value并执行查询,然后在同一页面上显示结果
- AJAX 请求不会在 400 个错误查询上执行失败
- 根据浏览器屏幕大小和媒体查询执行 php 代码
- 只有选中的复选框才能执行进一步的 ajax 查询
- SQLite+Javascript:在每个其他函数中执行多个查询
- 如何使用MongoDB执行具有“hasmany”关联的查询
- mongoose中嵌套查询执行的问题
- 我如何才能实时查看在Postgres上执行的查询
- Firebase-如何在列表查询中执行where项
- 节点.js MySQL 查询执行流程
- Javascript引擎(或其他可嵌入语言),用于类似mongodb的查询执行环境和多线程
- 如何使用PHP / JavaScript从客户端停止SQL查询执行
- 查询执行时间超过超时时发生ExtJS Catch事件
- node.js+用于循环+查询执行
- 如何使webEnumerator.moveNext等待executeQueryAsync查询执行
- 节点.js + 续集 + 查询执行
- 在从CFC返回结果之前,对AJAX查询执行字符串函数
- PHP查询执行无错误,但返回计数0