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

时间:2020-10-21 13:43:10

标签: 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,我该如何解决呢?

3 个答案:

答案 0 :(得分:1)

改为让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)
  });

请注意,您需要分配给 outside 变量xyzabc-在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 :(得分:0)

您的代码中有几个错误:

  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);

答案 2 :(得分:0)

最好的解决方案是使用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) ;
    });  
  });
}