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节点如何等待所有查询完成处理视图的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 查询树结构循环查询查看函数视图存储过程

javascript:循环中如何等待方法完成了再继续?

for循环内的多处理

运行方法并等待完成所有 for 循环 openmp

您如何等待主队列完成处理程序?

如何使用 Swift SpriteKit 在 For 循环中一一创建 SKSprite 节点