为什么“读取2个文件并返回差异”在NodeJS中不起作用?

时间:2018-10-28 06:35:51

标签: javascript node.js promise readfile

我需要一个具有2个文件名,读取它们并返回差异的函数。这是我写的,但是它确实会根据需要返回布尔值。

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开发人员)将使用该API /模块来开发测试用例/脚本,因此我需要让他们保持简单。

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

并且我想避免测试人员在脚本中使用'await'或'then()'等。

由于a === b返回了Promise,我进一步尝试替换

return a === b

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

return c

希望获得布尔值,但这也无济于事。

尝试了许多事情之后,看来唯一的方法是同步读取文件并进行比较,但我想尽可能地使用Node.js。

有人知道是否/如何异步进行吗?我想念什么吗?

1 个答案:

答案 0 :(得分:1)

我认为与其避免使用“ await”或“ then()”,还应使用promise功能。尝试像这样更改匹配功能:

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
    }
});