Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么;读取2个文件并返回diff“;不';你不在NodeJS工作吗?_Javascript_Node.js_Promise_Readfile - Fatal编程技术网

Javascript 为什么;读取2个文件并返回diff“;不';你不在NodeJS工作吗?

Javascript 为什么;读取2个文件并返回diff“;不';你不在NodeJS工作吗?,javascript,node.js,promise,readfile,Javascript,Node.js,Promise,Readfile,我需要一个函数,它接受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 {*} fil

我需要一个函数,它接受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都被解析。i、 e.console.log()打印文件的内容,使其可用,因此return语句应该返回diff(true/false),但它返回一个承诺。为什么? 我需要一个布尔值。此函数是API/模块的一部分,其他用户将使用它来开发测试用例/脚本,而这些用户主要不是javascript开发人员,因此我需要为他们保持简单。这种方法的典型用法是

if(匹配(,)){
logger.log('测试通过')
}

我希望避免测试人员在脚本中使用'wait'或'then()'等

因为
a===b
返回一个承诺,我进一步尝试替换它

返回a==b

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

return c
希望得到一个布尔值,但这也没用

在尝试了许多方法之后,看起来唯一的方法是同步读取文件并进行区分,但我希望尽可能使用Node.js


有人知道是否/如何异步完成吗?我遗漏了什么吗?

我认为与其避免使用“wait”或“then()”,不如使用promissions的特性。尝试如下更改匹配函数:

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

async
函数始终返回
Promise
s。同步程序流无法以某种方式等待异步的东西(如果没有一些真正糟糕的攻击)。拥抱它并调用
。然后在
Promise
上调用
,以获取它解析为的值。包装
Promise.all()
新Promise
中是我错过的一件事,因此我在调用函数中得到了
{}
未定义的
。请查看实时示例。还在出错吗?哪一行/var?不,不再,不再使用您的解决方案。。在我发布问题之前,我在试验时得到了不同的值。谢谢。