перебирать асинхронную функцию синхронно - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть функция, которая читает данные из базы данных 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')

Я получаю вывод, как только один раз, а затем элемент управления также не прерывается.

Я думаю, что есть некоторые проблемы с подключением к базе данных, поэтому я хочу сделать это синхронно и проверить.

// комментируйте меня, если вам нужен какой-либо код.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я решил проблему с помощью обратных вызовов.

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

, и это сработало.

0 голосов
/ 13 февраля 2019

У вас есть набор переменных (например, var azureData;), которые находятся в области действия модуля.

При двойном вызове функции оба набора вызовов функций будут использовать эти переменные совместно.

В частности, это означает, что file_name=fileName установит file_name на 'ZR_CUSTOMER_INVOICES Functional Specification', а затем на 'ZR_CONTACTS Functional Specification', и оба вызова будут продолжать использовать переменную со значением 'ZR_CONTACTS Functional Specification'.

Определить этипеременные внутри области действия app.Затем определите все функции, которым необходимо обращаться к ним внутри app, чтобы переменные находились в области видимости для них.

Каждый вызов app будет иметь свой собственный набор переменных, и они выиграют 'перезаписывать друг друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...