Как обрабатывать несколько массивов в асинхронных методах в node.js - PullRequest
0 голосов
/ 31 мая 2018

У меня очень большой массив (10 КБ), и я хочу разделить его (я сделал в соответствии с этим: https://stackoverflow.com/a/8495740/2183053, и это сработало), но мне нужно передать tempArray для запроса и ждать ответа, который будетбыть переданным в savetodb.

Может кто-нибудь помочь мне, пожалуйста.Чтобы было ясно, я хочу разделить большой массив и передать разделенные массивы в функцию запроса, затем перейти к сохранению в db и продолжить этот процесс, пока все массивы не будут очищены.

следующий код, который я сделал:

//i used waterfall because it worked in waiting to finish the first task before starting another 
async.waterfall([
  async.apply(handleFile, './jsonFile.json')
  runRequest1,
  savetoDb
], function(err) {
  console.log('waterfall1 complete')
})

function handleFile(data, callback) {
  var name
  var authorNames = []
  require('fs').readFile(data, 'utf8', function(err, data) {
    if (err) throw err
    var content = _.get(JSON.parse(data), [2, 'data'])
    for (var x = 0; x < content.length; x++) {
      authorNames.push(JSON.stringify(content[x]['author']))
    }
    //the large array is authorNames and im splitting it below:
    for (i = 0, j = authorNames.length; i < j; i += chunk) {
      temparray = authorNames.slice(i, i + chunk);
      setTimeout(function() {
        callback(null, temparray)
      }, 2000);
    }
  })
}

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Я добавил обещание.

const data = await handleFile('./jsonFile.json');
// save to db 


async function handleFile(filePath) {
    let arrayWillReturn = []; 

    var name
    var authorNames = []
    let data = await getFileData(filePath)
    var content = _.get(JSON.parse(data), [2, 'data'])
    for (var x = 0; x < content.length; x++) {
        authorNames.push(JSON.stringify(content[x]['author']))
    }
    //the large array is authorNames and im splitting it below:
    for (i = 0, j = authorNames.length; i < j; i += chunk) {
        arrayWillReturn.push(authorNames.slice(i, i + chunk));
    }
    return arrayWillReturn;
}

async function getFileData(fileName) {
    return new Promise(function (resolve, reject) {
        fs.readFile(fileName, type, (err, data) => {
            err ? reject(err) : resolve(data);
        });
    });
}
0 голосов
/ 03 июня 2018

Я отвечаю на свой вопрос для будущих ссылок.единственное, что я добавил, чтобы заставить мой код работать, - это Promise.Это звучит просто, но мне потребовалось некоторое время, чтобы понять функцию и реализовать ее, но это сработало, и оно того стоило.Большое спасибо за ответы.

0 голосов
/ 31 мая 2018

Вам нужно пообещать обрабатывать асинхронные вещи в nodejs

let findAllReceipts = function (accountArray) {
    const a = [];

    for (let i = 0; i < accountArray.length; i++) {
        a.push(new Promise((resolve, reject) => {
            receiptTable.find({accountNo: accountArray[i].accountNo}, function (err, data) {
                if (!err) {
                    resolve(data);
                } else {
                    reject(new Error('findPrice ERROR : ' + err));
                }
            });
        }));
    }

    return Promise.all(a);
};
...