Javascript 如何在节点js中的readline.on函数下使用wait函数

Javascript 如何在节点js中的readline.on函数下使用wait函数,javascript,node.js,ecmascript-6,es6-promise,Javascript,Node.js,Ecmascript 6,Es6 Promise,如何使用nodejs上的readline.on函数下的wait函数 我试图使用readline读取每一行。在函数上,从文件中读取每一行之后,我试图将每一行数据传递给另一个作为第三方api的函数,因此我已经为该函数编写了承诺,因此在readline下使用wait调用该函数。在函数上,但它不会从该函数返回结果。谁能帮我解决这个问题。提前谢谢 "use strict"; import yargs from 'yargs'; import fs from 'fs'; import redis from

如何使用nodejs上的
readline.on
函数下的wait函数 我试图使用
readline读取每一行。在
函数上,从文件中读取每一行之后,我试图将每一行数据传递给另一个作为第三方api的函数,因此我已经为该函数编写了承诺,因此在
readline下使用wait调用该函数。在
函数上,但它不会从该函数返回结果。谁能帮我解决这个问题。提前谢谢

"use strict";
import yargs from 'yargs';
import fs from 'fs';
import redis from 'redis';
import path from 'path';
import readline from 'readline';

const args = yargs.argv;

// redis setup
const redisClient = redis.createClient();
const folderName = 'sample-data';

// list of files from data folder
let files = fs.readdirSync(__dirname + '/' + folderName);

async function asyncForEach(array, callback) {
  for (let index = 0; index < array.length; index++) {
    await callback(array[index], index, array);
  }
};

async function getContentFromEachFile(filePath) {
  return new Promise((resolve, reject) => {
    let rl = readline.createInterface({
      input: fs.createReadStream(filePath),
      crlfDelay: Infinity
    });
    resolve(rl);
  });
};

async function readSeoDataFromEachFile() {
  await asyncForEach(files, async (file) => {
    let filePath = path.join(__dirname + '/' + folderName, file);
    let rl = await getContentFromEachFile(filePath);

    rl.on('line', async (line) => {
      let data = performSeoDataSetUpProcess(line);

      console.log(JSON.stringify(data.obj));

      let result = await getResultsFromRedisUsingKey(data.obj.name);

      console.log("result" + JSON.stringify(result));

    });
  });
};


async function getResultsFromRedisUsingKey(key) {
  return new Promise((resolve, reject) => {
    redisClient.get(key, function (err, result) {
      if (err) {
        resolve(err);
      } else {
        resolve(result);
      }
    });
  });
};

readSeoDataFromEachFile();
“严格使用”;
从“yargs”进口yargs;
从“fs”导入fs;
从“redis”导入redis;
从“路径”导入路径;
从“readline”导入readline;
常数args=yargs.argv;
//redis设置
const redisClient=redis.createClient();
const folderName='样本数据';
//数据文件夹中的文件列表
让files=fs.readdirSync(uu dirname+'/'+folderName);
异步函数asyncForEach(数组、回调){
for(让index=0;index{
设rl=readline.createInterface({
输入:fs.createReadStream(文件路径),
crlfDelay:无穷大
});
解决(rl);
});
};
异步函数readSeoDataFromEachFile(){
等待asyncForEach(文件,异步(文件)=>{
让filePath=path.join(uu dirname+'/'+folderName,file);
让rl=等待getContentFromEachFile(文件路径);
rl.on('line',异步(line)=>{
让数据=performSodatasetupProcess(行);
log(JSON.stringify(data.obj));
让result=wait GetResultsFromRedusingKey(data.obj.name);
log(“result”+JSON.stringify(result));
});
});
};
异步函数GetResultsFromRedusingKey(键){
返回新承诺((解决、拒绝)=>{
redisClient.get(键、函数(错误、结果){
如果(错误){
决心(错误);
}否则{
决心(结果);
}
});
});
};
readSeoDataFromEachFile();

您的函数
asyncForEach
asyncForEach
调用
getContentFromEachFile
的回调不返回承诺,因此无法将其用于异步/等待函数

getContentFromEachFile()不需要异步/等待。

因此,我会:

function asyncForEach(array, callback) {
  return new Promise(async (resolve, reject) => {
    let result = []
    array.forEach((file, index, files) => {
      // concat the callback returned array of each file into the result
      const res = await callback(file, index, files);
      result = result.concat(res);
    });
    return resolve(result);
  });
};

function getContentFromEachFile(filePath) {
  return readline.createInterface({
    input: fs.createReadStream(filePath),
    crlfDelay: Infinity
  });
};

async function readSeoDataFromEachFile() {
  return await asyncForEach(files, (file) => {
    return new Promise((resolve, reject) => {
      const filePath = path.join(__dirname + '/' + folderName, file);
      let callbackResult = [];
      const rl = getContentFromEachFile(filePath);

      rl.on('line', async (line) => {
        let data = performSeoDataSetUpProcess(line);
        console.log(JSON.stringify(data.obj));

        // add the result from redis into the generated data
        data.redisResult = await getResultsFromRedisUsingKey(data.obj.name);
        console.log("result" + JSON.stringify(data.redisResult));

        // store the result in the local variable
        callbackResult.push(data);
      });

      rl.on('close', () => {
        // finally return the stored result for this file
        return resolve(callbackResult);
      });
    });
  });
};

console.log(readSeoDataFromEachFile());

getContentFromEachFile函数返回每个文件内容,但问题无法从此函数调用GetResultsFromRedissingKey结果是否确实
GetResultsFromRedissingKey()
函数返回承诺?很抱歉,我没有在问题上添加GetResultsFromRedissingKey函数,现在我已经添加了请再次检查的问题。什么是登录的
data.obj
result
?谢谢@dun32您给了我很多帮助