2017-09-23 7 views
0

を発現作る:非同期私は2つの機能、第有するnodejsで呼び出し、

router.post('/getStances', function(req, res, next) { 
    var text = '{"success":"0"}'; 
    text = queries.getStances(req.body.issues[0], req.body.issues[1], req.body.issues[2], req.body.issues[3]); 
    var obj = JSON.parse(result); 
    res.send(obj); 
}); 

秒:

getStances: function (a, b, c, d) { 
     var sendback = '{"stances":['; 
     sendback += '{"1":['; 
     var querytext = "SELECT * FROM allIssues WHERE topicname = '"+ a +"'"; 
     query = client.query(querytext,function (callback) { 
      query.on('row', (row) => { 
       sendback += "{" + '"'+row['topicstance']+'"' + " : " + '"'+ row['topicdescription'] + '"'+ "} , "; 
       console.log(sendback); 
      }); 
     }); 

     querytext = "SELECT * FROM allIssues WHERE topicname = '"+ b +"'"; 
     query = client.query(querytext); 
      query.on('row', (row) => { 
       sendback += "{" + '"'+ row['topicstance'] + '"'+ " : " + '"'+ row['topicdescription'] + '"'+ "} , "; 
      }); 
      query.on('end',() => { 
       sendback += "]}"; 
       sendback += "]}"; 
       client.end(); 
       return sendback; 
      }); 
     } 

最初の機能は、クライアントアプリケーションによって呼び出され、それは次にgetStancesどのを呼び出しDB呼び出しを行い、内部にすべてのdb情報を含むJSON文字列を返す必要がありますが、textundefinedに設定され、残りのルータ機能が実行されると、textをJSONに解析しようとしますそのundefined、それは動作しません。ルータの機能を非同期にして、残りのコードを続行する前にtext = getStances()が完了するのを待つようにするにはどうすればよいですか?私はコールバックと約束を試みましたが、多かれ少なかれ同じ結果を得ています。どういうふうに機能するのか分かりません。誰かが私がこれをどのように修正できるかの例を挙げることはできますか?

+0

'client.query()'のドキュメントをダブルチェックしてください。コールバックの最初の引数をErrorオブジェクトにしないでください。文字列を使ってJSON文字列を構築しないでください。醜いです。単純にオブジェクトを使用します。応答としてオブジェクトを送信すると、オブジェクトはJSONオブジェクトに変換されます。 – Mikey

答えて

1

getStances()は、完了したことを示す方法、つまりコールバックまたは約束を必要とします。

あなたの関数のシグネチャは次のようになります。

getStances: function (a, b, c, d, callback) { 
    someAsynFunction(arg, function(err, result){ 
     if (err) return callback(err) // errors go first by convention 
     callback(null, results) // callback(error, result) 
    } 
} 

その後、コールバックのためにgetStances()に関数を渡すことで、それを使用することができます。

let i = req.body.issues // for brevity 
text = queries.getStances(i[0], i[1], i[2], i[3], function(err, result){ 
    if (err) return console.log("error: ", err) 
    var obj = JSON.parse(result); 
    res.send(obj); 
); 

これは、基本的なノードパターンです。

使用しているDBクライアントは不明ですが、コードに別の問題があると思われます。

getStances()で2つの非同期コールを作成していて、2番目の前に最初の1つのフィニッシングをカウントしているようです。これは中断する可能性が高いため、クライアントが完了したことをクライアントがどのように通信しているかを調べる必要があります(query.on('finished')などがありますか?)。

関連する問題