2017-09-25 17 views
1

mysqlモジュールを使用してデータベーステーブルにいくつかの値を挿入するには、関数を呼び出してnode.jsとします。関数はforループ内で呼び出され、関数内に各INSERTクエリの最後のinsertIdが得られます。node.js + mysqlを使用した最後のinsertIdのグローバルスコープ

私の目的

私は自分のコードの後半でそれらを使用するために、アレイにこれらid'sを保存したいが、私ははそれを行うことはできません。

- 関数CALL

for(var i=0;i<some_number;i++){ 
    if (<something is true>){ 

    var lastid = []; 
    //Function calling 
    function_a(x, y, z, w, function(error, result) { 
    if(!error){ 
     lastid.push(result.insertId); 
     } 
    //To Do 
    else{} 
    }); 
} 
} 

- FUNCTION

function function_a(a, b, c, d, callback){ 
//Connection to the DB 
const con = mysql.createConnection({ 
    host: 'host', 
    user: 'user', 
    password: 'password', 
    database: 'database' 
}); 

//DB query 
var query = "INSERT INTO my_table (column1, column1, column1, column1) VALUES ('"+a+"', '"+b+"', '"+c+"', '"+d+"')"; 
con.query(query, (err, rows) => { 
var e = rows.insertId; 
return callback(err, e); 
}); 
con.end(); 
} 

問題は、私は関数の外部IDを使用できないことです。

どのようにすればいいですか?これは可変スコープですか?

答えて

0

ここにいくつかの問題がありますが、それらは部分的には可変範囲です。

forループの前にvar lastid = [];を置くと、ループの後で使用できるようになります。ただし、ループ内でコールバックメカニズムがある場合は、ループ全体が完了するまで待つ必要があります(0からsome_number-1までのコールバックすべて、lastid配列の正しい値を持つようにしなければなりません)。 。。。function_aasynchronous機能であるあなたは、Googleがコールバックのためにforループで処理することができます彼らとか約束して

+0

感謝をあなたの答えのために。私は最終的にコールバック関数を使用するとき、これは可変スコープに関するものだと信じています。私は '配列'を作成しました。idは常に空です。私を助けることができるサンプル? – GeoDim

+0

forループの後で呼び出しているので空ですが、forループが反復を終了したという保証はありません。これは、その中の非同期操作(データベースクエリなど)のために起こります。それを正しく実行するには、[this loop callback pattern](http://www.richardrodger.com/2011/04/21/node-js-how-to-write-a-for-loop-コールバック/#。WcixIFuCyUk)、または[この例](promps.each(https://stackoverflow.com/questions/28736452/bluebird-promise-serial-iteration-and-resolve-to-modified-array) )関数の使用。 – cassini

0

機能を、それを行うあなたのケースでは、この作業を行うにasyncモジュールを使用することができます。

var taskIds = Array.apply(null, {length: some_number}).map(Number.call, Number); 
var lastid = []; 
async.eachLimit(taskIds, 32, function (taskId, done) { 
    if (<something is true>) { 
    function_a(x, y, z, w, function(error, result) { 
     if(!error){ 
     lastid.push(result.insertId); 
     } 
     //To Do 
     else{} 
     done() 
    }); 
    } else { 
    done() 
    } 
}, function() { 
    // Do some thing with lastid 
    console.log(lastid); 
}); 
+0

あなたの返信ありがとうございますが、動作しません。私は 'async.eachLimit'にいくつかのモジュールを必要とするでしょうか? – GeoDim

+0

@GeoDimはい、 'async'は' mysql'のようなヘルパーモジュールです。 https://caolan.github.io/async/docs.html – hoangdv

関連する問題