Javascript 为什么;读取2个文件并返回diff“;不';你不在NodeJS工作吗?
我需要一个函数,它接受2个文件名,读取它们并返回一个diff。这是我写的,但它确实返回我需要的布尔值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
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?不,不再,不再使用您的解决方案。。在我发布问题之前,我在试验时得到了不同的值。谢谢。