在node.js中嵌套异步查询

时间:2013-08-16 01:12:04

标签: node.js

我正在尝试编写一个执行两个查询的函数,并希望能够访问最终代码块中的两个记录集;我的代码看起来类似于:

295     connection.query(sql1, function selectDb(err, results, fields) {
296         if (err) {
297           throw err;
298         }
299
300         result = results[0];
301         console.log(result);
302
303         console.log(sql2);
304         connection.query(sql2, function selectDb(err, results, fields) {
305             if (err) {
306               throw err;
307             }
309         console.log(result);

问题是var结果保留第一个记录集,直到第二个查询@ 304之后,并显示'undefined'@ 309(在之前的显示中设置了记录)。

我不知道如何将第一个记录集值传递给内部代码异步代码块@304;试图将结果添加为参数;

304         connection.query(sql2, function selectDb(err, results, fields, result) {

结果仍未定义@ 309

帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

  1. 回调参数名称完全是您的选择。有一个规格     告诉你什么将被传递到哪个参数和插槽可能     被命名以帮助进一步描述,但实际的名称     传递给它的实际参数取决于你。保持     对于其他读取代码的人来说,期望的名字是一个好主意     未来,但在权宜之计可以变化。这意味着你可以使用     结果1和结果2而不仅仅是结果,在回调中,如果     这会有所帮助。
  2. 您的第二个回调是一个闭包,可以读取定义它的块中的变量。
  3. 我听说为匿名函数回调命名是不好的做法。
  4. ???    // variables sql1, sql2 need to be defined prior to the code below
    295    connection.query(sql1, function(err, results1, fields1) {
    295.1       var result;  // dont make result a global
    296         if (err) {
    297           throw err;
    298         }
    299
    300         result = results1[0];
    301         console.log(result);
    302
    303         console.log(sql2);
    304         connection.query(sql2, function(err, results2, fields2) {
    305             if (err) {
    306               throw err;
    307             }
    309             console.log(result);
    310             console.log(results1);
    311             console.log(results2);
    312       });
    313   });
    

答案 1 :(得分:0)

将变量名称从result更改为app;现在有效;必须对标签'结果'有些神奇;使用mysql.Connection。