节点新手,当我在学生名册中骑自行车时,我需要检查一下老师是否要求他们进行辅导。
我意识到我不能这样做:
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中提取,这就是我没有将请求检查与原始名册查询捆绑在一起的原因。
提前致谢
答案 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
});