同步迭代异步函数
我有一个函数从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;
这工作正常。
但如果我两次打电话给应用程序。
const app = require('./index.js');
app('ZR_CUSTOMER_INVOICES Functional Specification')
app('ZR_CONTACTS Functional Specification')
我只获得输出一次,然后控件也不会中断。
我认为与数据库的连接存在一些问题,所以我想同步并检查。
//如果你需要任何代码,请评论我。
回答如下:你有一堆变量(例如var azureData;
),它们是作用于模块的。
当您调用该函数两次时,两组函数调用将共享这些变量。
特别是,这意味着file_name=fileName
将file_name
设置为'ZR_CUSTOMER_INVOICES Functional Specification'
然后设置为'ZR_CONTACTS Functional Specification'
,并且两个调用将继续使用值为'ZR_CONTACTS Functional Specification'
的变量。
在app
范围内定义那些变量。然后定义所有需要在app
中访问它们的函数,以便变量在它们的范围内。
每次调用app
都会有自己的一组变量,它们不会互相覆盖。