JavaScript等待两个函数完成,然后继续执行函数三



我正在尝试弄清楚_callback系统,但似乎没有让它发挥作用,这就是我目前所拥有的。

var xyz = 0;
var abc = 0;
combineData(13, 17)
function GetfromDB1(variable, _callback){
//get request
var abc = variable;
_callback();
} 
function GetfromDB2(variable, _callback){
//get request
var xyz = variable;
_callback();
} 
function combineData(number1, number2){
function GetfromDB1(number1, function(){
console.log('done')      
});

function GetfromDB2(number2, , function(){
console.log('done')      
});      
// continue to do stuff with data
console.log(xyz + abc) 
}

最后两个控制台日志似乎没有等待回调,两者都为0,我该如何解决这个问题?

改为使GetfromDB1返回Promises,然后您可以在两次调用中调用Promise.all以等待两个函数完成:

var xyz = 0;
var abc = 0;
function GetfromDB1(variable) {
return new Promise((resolve) => {
//get request
abc = 12;
resolve();
});
}
function GetfromDB2(variable) {
return new Promise((resolve) => {
//get request
xyz = 17;
resolve();
});
}
Promise.all([GetfromDB1(), GetfromDB2()])
.then(() => {
console.log(xyz)
console.log(abc)
});

请注意,您需要为外部的变量xyzabc赋值——在DB函数内部创建这样的变量会使它们在本地范围内,这是不起作用的。

但是,如果DB函数解析为XYZ和ABC值,那将是一个更好的设计:

function GetfromDB1(variable) {
return new Promise((resolve) => {
//get request
resolve(13);
});
}
function GetfromDB2(variable) {
return new Promise((resolve) => {
//get request
resolve(17);
});
}
Promise.all([GetfromDB1(), GetfromDB2()])
.then(([xyz, abc]) => {
console.log(xyz)
console.log(abc)
});

您的代码中有几个错误:

  1. 您需要调用GetfromDB1,而不是在combineData((中再次声明它
  2. 在GetfromDB1和GetfromDB2中,您不需要声明abc和xyz,否则您将隐藏全局变量并使用不会传播到外部的本地变量

var xyz = 0;
var abc = 0;
function GetfromDB1(variable, _callback){
//get request
abc = variable;
_callback();
} 
function GetfromDB2(variable, _callback){
//get request
xyz = variable;
_callback();
} 
function combineData(number1, number2){
GetfromDB1(number1, function(){
console.log('done')      
});

GetfromDB2(number2, function(){
console.log('done')      
});      
}
combineData(13, 17)
// continue to do stuff with data   
console.log(xyz + abc);

最好的解决方案是使用Promises。如果你不能/不想使用它们,这里有一个带有回调的解决方案:

var xyz = 0;
var abc = 0;
combineData(13, 17);
function GetfromDB1(variable, _callback){
//get request
abc = variable;
_callback();
} 
function GetfromDB2(variable, _callback){
//get request
xyz = variable;
_callback();
} 
function combineData(number1, number2){
GetfromDB1(number1, function(){
console.log('done 1');
GetfromDB2(number2, function(){
console.log('done 2');
console.log(xyz + abc) ;
});  
});
}

最新更新