Почему «чтение 2 файлов и возврат diff» не работает в NodeJS? - PullRequest
0 голосов
/ 28 октября 2018

Мне нужна функция, которая берет 2 имени файла, читает их и возвращает diff.Вот что я написал, но он возвращает логическое значение по мере необходимости.

const fs = require('fs')
const util = require('util')

const readFile = util.promisify(fs.readFile)
const access = util.promisify(fs.access)

/**
 * if exists, read the file (async)
 * @param {*} fileName
 * @returns Promise that if resolved will produce file contents
 */

async function 
verifyAndRead (fileName) {
    let _txt = null
    try {
        await access(fileName)
        .then(() => readFile(fileName))
        .then((txt) => _txt = txt.toString())
    }
    catch (e) {
        console.error(`verifyAndRead(): ${e.stack}`)
    }
    // console.log(`foo(): ${_txt}`)
    return _txt
}

async function 
match (file1, file2) {
    // logger.trace(`match ('${file1}', '${file2}')`)

    let a = await verifyAndRead(f1)
    let b = await verifyAndRead(f2)

    return a === b
}

В match () разрешены и a, и b.т.е. console.log () печатает содержимое файла (ов), чтобы они были доступны, поэтому инструкция return должна возвращать diff (true / false), но возвращает Promise.Зачем?Мне нужен логическийЭта функция является частью API / модуля, который будет использоваться другими пользователями для разработки тестовых случаев / сценариев и которые в первую очередь не являются разработчиками javascript, поэтому мне нужно сделать все проще для них.Типичное использование этого было бы

if (match(<expected_output>, <current_output>)) { logger.log('Test passed.') }

, и я хотел бы избежать того, чтобы тестировщикам приходилось использовать в своих скриптах «await» или «then ()» и т. Д.

Поскольку a === b возвращает Обещание, я также попытался заменить

return a === b на

let c = await (() => {
    a === b
})()

return c

в надежде получить логическое значение, но это тоже не помогло.

После многих попыток, похоже, что единственный способ сделать это - прочитать файлы синхронно и выполнить различие, но я бы хотел сделать это с Node.js как можно больше.

Кто-нибудь знает, если / как это можно сделать асинхронно?Я что-то упустил?

1 Ответ

0 голосов
/ 28 октября 2018

Я думаю, что вместо того, чтобы избегать использования 'await' или 'then ()', вы должны использовать функцию обещаний.попробуйте изменить функцию соответствия следующим образом:

const fs = require('fs')
const util = require('util')

const readFile = util.promisify(fs.readFile)
const access = util.promisify(fs.access)

async function
verifyAndRead (fileName) {
    let _txt = null
    try {
        await access(fileName)
            .then(() => readFile(fileName))
            .then((txt) => _txt = txt.toString())
    }
    catch (e) {
        console.error(`verifyAndRead(): ${e.stack}`)
    }
    return _txt
}

async function match (f1, f2) {
    return new Promise(resolve => {
        Promise.all([verifyAndRead(f1), verifyAndRead(f2)]).then((values) => {
            resolve(values[0] === values[1]);
        });
    });
}

match('package.json', 'package-lock.json').then((result) => {
    if (result) {
        // if match do your stuff
    }
});
...