2017-07-18 4 views
0

node-mysqlとforループの問題を抱えています。 は基本的に何をしようとしているi'amは私のデータベースからforループとmysqlノードすべてのクエリが処理を完了するのを待つ方法

---------- ---------- 
URL  | COUNT 
---------- ---------- 

の配列やオブジェクトを取得することで、URLは背景とカウントがINTであるとして使用される写真です。

問題は次のとおりです。ノードは、MYSQLのすべてのクエリ/応答がコールバックでビューを処理してレンダリングするのを待たず、私のビューで空の配列を取得しています。

415 | 416 ... 

(それは検索する文書のIDのリストです):クエリのための私の検索パラメータのような配列の内部にあるので、

私はFOR LOOP内でこれを実行する必要があります。

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); 
}); 
+0

あなたがこのアプローチhttps://stackoverflow.com/a/44715229/5361130を試すことができます...ここでそれhttps://caolan.github.io/async

そして、あなたは、この小さなハックを試してみてくださいforループを使用する方法について具体的であるかについての詳細を読みます –

答えて

0

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で最も便利なモジュールの1つです。

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); 
     } 
    }); 
}; 

}); 
関連する問題