使用Q在带有express和mysql的节点中返回二级查询

时间:2014-10-19 12:31:47

标签: mysql node.js express q

节点新手,当我在学生名册中骑自行车时,我需要检查一下老师是否要求他们进行辅导。

我意识到我不能这样做:

var checkRequest = function(id){
    var value = '';
    roster.query('SELECT * FROM teacher_request WHERE student_id ='+id, function(err, row){
        value = row.length;
    }
    return value;
}

在对promises进行一些挖掘之后看起来像是一个很好的解决方案,但是如果我只是从checkRequest函数返回deferred.promise,我得到的只是一个对象,它表示[deferred promise]我无法访问实际来自的数据。 (或者还没弄明白怎么样)

如果我跟随他们的api并使用.then(如getRow中所示)功能,我回到了以前的问题。

function checkRequest(id) {
  console.log(id);
  var deferred = Q.defer();
    connection.query('SELECT * FROM teacher_request WHERE student_id ='+id, function(err, row){
        deferred.resolve(row.length);
    });
  return deferred.promise;
}

var getRow = function(id){
    checkRequest(id).then(function(val) {
        console.log(val); // works great
        return val; //back to the same problem
    });
}

名单需要能够从外部API中提取,这就是我没有将请求检查与原始名册查询捆绑在一起的原因。

提前致谢

1 个答案:

答案 0 :(得分:0)

根据您发布的内容,我认为您还没有真正理解承诺的概念。它们允许您在异步操作完成后(通过成功或失败)排队执行的回调。

因此,不应以某种方式将结果返回到同步工作流,而应将该工作流转换为异步工作。这是当前问题的一个小例子:

// your students' ids in here
var studentsArray = [ 1, 2, 5, 6, 9 ];

for( var i=0; i<studentsArray.length; i++ ) {
  checkRequest( i )
    .then( function( data ){
      console.log( data.student_id );

      // any other code related to a specific student in here
    });
}

或其他选项,如果您同时需要所有学生的数据:

// your students' ids in here
var studentsArray = [ 1, 2, 5, 6, 9 ];

// collect all promises
var reqs = [];    

for( var i=0; i<studentsArray.length; i++ ) {
  reqs.push( checkRequest( i ) );
}

Q.all( reqs )
 .then( function(){
   // code in here
   // use `arguments` to access data
 });