我的问题如下:
我在 Node 中有很多 Mysql 请求要做,而且它是异步完成的。
在下面的示例中,我想在函数 doStuffWithInput 开始之前等待 checkExists 函数以一种或另一种方式完成(并填充我的输入变量)。除了在各种可能的回调中(在每个'input=keys;'之后)多次粘贴 doStuffWithInput 之外,我没有看到任何其他方法......我相信有更好的方法。有任何想法吗?
var input;
db.checkExists_weekParents(id,function(count){ //check table existence/number of rows
if(count!==='err'){ //if doesnt exist, create table
db.create_weekParents(id,function(info){
if(info!=='err'){ //as table is empty, create input from a full dataset
db.makeFull_weekParents(id,function(keys){
input = keys;
});
}
});
}else{ //if exists, check number of entries and create input keys as a subset of the full dataset
db.makeDiff_weekParents(id,function(keys){
if(keys.length!==0){
input = keys;
}else{ //if the table already has full dataset, we need to export and start again.
db.export_weekParents(id,function(info){
db.create_weekParents(id,function(info){
if(info!=='err'){
db.makeFull_weekParents(id,function(keys){
input = keys;
});
}
});
});
}
});
}
});
完成所有这些后,我们还有很多事情要做(生成子进程、更多数据库操作等...)
doStuffWithInput(input,function(output){
//Tons of stuff here
console.log(output);
})
我真的希望这足够清楚,如果需要,我会澄清。
编辑
尝试使用 Promise 重写似乎是最好的方法,我想这对于像我这样在末日金字塔中挣扎的其他人来说是一个很好的例子。到目前为止,我有:
var Q = require('q');
function getInput(){
var dfd = Q.defer();
db.check_weekParents(id,function(count){
console.log('count '+count);
if(count==='err'){
db.create_weekParents(id,function(info){
if(info!=='err'){
console.log('created table');
db.makeDiff_weekParents(id,function(keys){
input = keys;
dfd.resolve(input);
});
}
});
}else{
db.makeDiff_weekParents(id,function(keys){
input=keys;
dfd.resolve(input);
});
}
});
return dfd.promise;
}
getInput().then(function (input) {
console.log(input);
});
太神奇了!!