for循环和mysql节点如何等待所有查询完成处理视图
Posted
技术标签:
【中文标题】for循环和mysql节点如何等待所有查询完成处理视图【英文标题】:For loop and mysql node how to wait for all queries to finish to process view 【发布时间】:2017-12-23 01:26:07 【问题描述】:我正在努力解决 node-mysql 和 for 循环的问题。 基本上我想要做的是得到一个数组或对象
---------- ----------
URL | COUNT
---------- ----------
从我的数据库中,URL 是用作背景的图片,count 是一个 INT。
问题是:节点不等待 MYSQL 的所有查询/回答来处理并使用回调呈现视图,因此,我的视图上得到了一个空数组。
我需要在 FOR LOOP 中执行此操作,因为我的查询搜索参数位于如下数组中:
415 | 416 ...
(这是要搜索的文档 ID 列表)。
app.get('/next2', function(req, res)
function callback (s6)
cards = s6;
res.render('step2.ejs',
DocumentsNextPage: DocumentsNextPage,
cards: cards
);
;
for (i = 0; i < DocumentsNextPage.length; i++)
connection.query('SELECT DISTINCT url FROM documents WHERE documents.id = ?; SELECT COUNT(DISTINCT metas.name) AS cnt FROM documents, metas, documents_has_metas WHERE documents.id = documents_has_metas.documents_id AND metas.id_meta = documents_has_metas.metas_id AND documents.id = ?', [DocumentsNextPage[i], DocumentsNextPage[i]], function(err, results)
if (err) throw err;
s6.push(results[0][0].url, results[1][0].cnt);
);
;
callback(s6);
);
【问题讨论】:
你可以试试这个方法***.com/a/44715229/5361130 【参考方案1】:由于 node.js 本质上是异步的,最好使用异步模块。
var async=require("async");
app.get('/next2', function(req, res)
function callback (s6)
cards = s6;
res.render('step2.ejs',
DocumentsNextPage: DocumentsNextPage,
cards: cards
);
;
async.forEach(DocumentsNextPage,function(data,cb)
connection.query('SELECT DISTINCT url FROM documents WHERE documents.id = ?; SELECT COUNT(DISTINCT metas.name) AS cnt FROM documents, metas, documents_has_metas WHERE documents.id = documents_has_metas.documents_id AND metas.id_meta = documents_has_metas.metas_id AND documents.id = ?', [DocumentsNextPage[i], DocumentsNextPage[i]], function(err, results)
if (err)
cb(err);
else
s6.push(results[0][0].url, results[1][0].cnt);
cb();
);
,function(err,result)
if(err)
throw err;
else
callback(s6);
);
);
async 是 node.js 中最有用的模块之一。在此处阅读更多信息https://caolan.github.io/async
如果你特别想使用 for 循环,那么试试这个小技巧。
app.get('/next2', function(req, res)
function callback (s6)
cards = s6;
res.render('step2.ejs',
DocumentsNextPage: DocumentsNextPage,
cards: cards
);
;
for (i = 0; i < DocumentsNextPage.length; i++)
connection.query('SELECT DISTINCT url FROM documents WHERE documents.id = ?; SELECT COUNT(DISTINCT metas.name) AS cnt FROM documents, metas, documents_has_metas WHERE documents.id = documents_has_metas.documents_id AND metas.id_meta = documents_has_metas.metas_id AND documents.id = ?', [DocumentsNextPage[i], DocumentsNextPage[i]], function(err, results)
if (err) throw err;
s6.push(results[0][0].url, results[1][0].cnt);
if(i==DocumentsNextPage.length-1)
callback(s6);
);
;
);
【讨论】:
以上是关于for循环和mysql节点如何等待所有查询完成处理视图的主要内容,如果未能解决你的问题,请参考以下文章