简体   繁体   English

同步迭代异步函数

[英]iterate over asynchronous function synchronously

I have a function which reads data from oracle database, excel file and does some operations on the data and then stores the result data in an excel file. 我有一个函数,该函数从oracle数据库,excel文件中读取数据并对数据进行一些操作,然后将结果数据存储在excel文件中。

const app = require('./index.js');
app('ZR_CUSTOMER_INVOICES Functional Specification')
const azureFunction = require('./connections/azureConnection');
const idsFunction = require('./connections/idsconnection');
const xlsFunction = require('./connections/readExcel');
const writeToExcel = require('./connections/writeToExcel');
var azureData;
var idsData;
var xlData;
var xlColumns;
var azureColumns;
var idsColumns;
var resultData;
var table_name;
var file_name='';
function app(fileName){
  file_name=fileName
  xlsFunction(file_name,xlCallback);
}
function xlCallback(xlresult,tName){
  table_name=tName;
  xlData=xlresult
  xlColumns=xlData.map((a,i)=>{
    return a.Columns
  })
  var azquery=`exec sp_columns  ${table_name}`
  azureFunction(azquery,acallback);
}
function acallback(azresult){
  // let table_name=xlData[0]['View Name']
  let idsquery=`select COLUMN_Name from ids_columns where table_id = (select table_id from ids_tables where table_name ='${table_name}')`;
  azureData=azresult;
  azureColumns=azureData.map((a,i)=>{
    return a.value
  })
  idsFunction(idsquery,icallback);
}
function icallback(idsresult){
  idsData=idsresult;
  idsColumns=idsresult.rows.map((a,i)=>{
    return a[0]
  })
  finalFunction()
}
function finalFunction(){
  resultData=xlData.map((a,i)=>{
    if(a.Columns==''){
      return;
    }
    a['inIds?']=idsColumns.includes(a.Columns);
    a['inAzure?']=azureColumns.includes(a.Columns);
    return a;
  })
  resultData=resultData.filter((a,i)=>{
    return a!==undefined;
  })
  // console.log(resultData);
  writeToExcel(resultData,file_name)
  console.log('done');
}

module.exports=app;

this is working fine. 这很好。

but if I make function call to app twice. 但是如果我两次对应用程序进行函数调用。

const app = require('./index.js');
app('ZR_CUSTOMER_INVOICES Functional Specification')
app('ZR_CONTACTS Functional Specification')

I am getting output as done only once and then the control also doesn't break. 我只完成一次输出,然后控件也没有中断。

I think there is some problem with connections to database, so I want to do this synchronously and check. 我认为与数据库的连接存在一些问题,因此我想同步进行检查。

//comment me if you need any code. //如果需要任何代码,请评论我。

You have a bunch of variables (eg var azureData; ) which are scoped to the module. 您有一堆变量(例如var azureData; ),它们的作用域var azureData;于模块。

When you call the function twice, both sets of function calls will share those variables. 当您两次调用该函数时,两组函数调用将共享这些变量。

In particular, this means that file_name=fileName will set file_name to 'ZR_CUSTOMER_INVOICES Functional Specification' and then to 'ZR_CONTACTS Functional Specification' , and both calls will continue to use the variable with the value 'ZR_CONTACTS Functional Specification' . 特别是,这意味着file_name=fileName会将file_name设置为'ZR_CUSTOMER_INVOICES Functional Specification' ,然后设置为'ZR_CONTACTS Functional Specification' ,并且两个调用将继续使用值为'ZR_CONTACTS Functional Specification'的变量。

Define those variables inside the scope of app . app范围内定义这些变量。 Then define all the functions which need to access them inside of app too so that the variables are in scope for them. 然后定义所有需要在app内部访问它们的函数,以使变量在它们的范围内。

Each call to app will then have its own set of variables and they won't overwrite each other. 这样,每次调用app都会有自己的一组变量,并且它们不会互相覆盖。

I have solved the problem using callbacks. 我已经使用回调解决了问题。

const azureFunction = require('./connections/azureConnection');
const idsFunction = require('./connections/idsconnection');
const xlsFunction = require('./connections/readExcel');
const writeToExcel = require('./connections/writeToExcel');
const done = require('./app');
var azureData;
var idsData;
var xlData;
var xlColumns;
var azureColumns;
var idsColumns;
var resultData;
var table_name;
var file_name='';
function app(fileName){
  file_name=fileName
  xlsFunction(file_name,xlCallback);
}
function xlCallback(xlresult,tName){
  table_name=tName;
  xlData=xlresult
  xlColumns=xlData.map((a,i)=>{
    return a.Columns
  })
  var azquery=`exec sp_columns  ${table_name}`
  azureFunction(azquery,acallback);
}
function acallback(azresult){
  // let table_name=xlData[0]['View Name']
  let idsquery=`select COLUMN_Name from ids_columns where table_id = (select table_id from ids_tables where table_name ='${table_name}')`;
  azureData=azresult;
  azureColumns=azureData.map((a,i)=>{
    return a.value
  })
  idsFunction(idsquery,icallback);
}
function icallback(idsresult){
  idsData=idsresult;
  idsColumns=idsresult.rows.map((a,i)=>{
    return a[0]
  })
  finalFunction()
}
function finalFunction(){
  resultData=xlData.map((a,i)=>{
    if(a.Columns==''){
      return;
    }
    a['inIds?']=idsColumns.includes(a.Columns);
    a['inAzure?']=azureColumns.includes(a.Columns);
    return a;
  })
  resultData=resultData.filter((a,i)=>{
    return a!==undefined;
  })
  // console.log(resultData);
  writeToExcel(resultData,file_name)
  console.log('done');
  done.onDone()
}

module.exports=app;
const app = require('./index.js');
app('ZR_CUSTOMER_INVOICES Functional Specification')
function onDone(){
    app('ZR_CONTACTS Functional Specification')
}
exports.onDone=onDone

and it worked. 而且有效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM