Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript等待两个函数完成,然后继续执行函数三_Javascript - Fatal编程技术网

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

JavaScript等待两个函数完成,然后继续执行函数三,javascript,Javascript,我正试图找出_回调系统,但它似乎无法正常工作,这就是我目前所拥有的 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 va

我正试图找出_回调系统,但它似乎无法正常工作,这就是我目前所拥有的

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
s返回承诺,然后您可以调用
Promise。两个调用上的所有
都等待两个函数完成:

var xyz=0;
var-abc=0;
函数GetfromDB1(变量){
返回新承诺((解决)=>{
//获取请求
abc=12;
解决();
});
}
函数GetfromDB2(变量){
返回新承诺((解决)=>{
//获取请求
xyz=17;
解决();
});
}
所有([GetfromDB1(),GetfromDB2()]))
.然后(()=>{
console.log(xyz)
控制台日志(abc)

});您的代码中有几个错误:

  • 您需要调用GetfromDB1,而不是在combineData()中再次声明它
  • 在GetfromDB1和GetfromDB2中,不需要声明abc和xyz,否则会对全局变量进行阴影处理,而使用不会传播到外部的局部变量
  • var xyz=0;
    var-abc=0;
    函数GetfromDB1(变量,_回调){
    //获取请求
    abc=变量;
    _回调();
    } 
    函数GetfromDB2(变量,_回调){
    //获取请求
    xyz=变量;
    _回调();
    } 
    函数组合数据(编号1,编号2){
    GetfromDB1(编号1,函数(){
    console.log('done')
    });
    GetfromDB2(数字2,函数(){
    console.log('done')
    });      
    }
    组合数据(13,17)
    //继续处理数据
    
    控制台日志(xyz+abc)最好的解决方案是使用。如果您不能/不想使用它们,这里有一个回调解决方案:

    var xyz=0;
    var-abc=0;
    联合数据(13,17);
    函数GetfromDB1(变量,_回调){
    //获取请求
    abc=变量;
    _回调();
    } 
    函数GetfromDB2(变量,_回调){
    //获取请求
    xyz=变量;
    _回调();
    } 
    函数组合数据(编号1,编号2){
    GetfromDB1(编号1,函数(){
    console.log('done1');
    GetfromDB2(数字2,函数(){
    console.log('done2');
    控制台日志(xyz+abc);
    });  
    });
    
    }
    GetFromDB
    更改为承诺是否可行,并在最后使用
    promise.All()
    来解决承诺?存在范围问题,您正在重新说明函数和变量请显示
    //get request
    的作用/返回。回调是一种古老的模式;它们的几乎所有用法都转换为承诺或可观测。只需一个简单的数组,我会注意这里的显式承诺构造反模式。让OP显示
    //get request
    后面的实际代码可能是值得的。否则,这就是一个不必要地使同步代码异步的示例。感谢您的承诺。两个调用都是异步的,因此工作得非常完美