我是node.js和stackoverflow的新手,但我遇到了一些麻烦:我想读取两个文件并以特定顺序对其进行操作。问题是我不知道哪一个将首先被读取,所以我不知道如何确保它们将以正确的顺序触发。
举个例子,假设我要读取两个文件并将它们写入响应中:
fs.readFile('./file1',(err,data) => {
res.write(data);
})
fs.readFile('./file2',(err,data) => {
res.write(data);
})
即使第二个文件小于第一个文件,我如何确保第一个文件在第二个文件之前被写入?
我可以做到:
fs.readFile('./file1',(err,data) => {
res.write(data);
fs.readFile('./file2',(err,data) => {
res.write(data);
})
})
但是它就像一个阻塞结构:第二个在第一个结束之前无法开始读取,这不是Node.js的重点...对吗?
PS:很抱歉,问题是愚蠢的还是我的英语不好?
答案 0 :(得分:0)
Promise
和async/await
存在的原因之一(就是其中的原因之一)就是要解决此类问题。
您可以创建一个包装器来返回Promise
:
function readSomething(filePath) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, (err, data) => {
if (err) reject(err);
else resolve(data);
});
}
然后您可以打电话给
// called in parallel
const result1 = readSomething('./file1');
const result2 = readSomething('./file2');
result1.then((data) => {
res.write(data) // or anything
// to order, chaining promise
return result2;
})
.then(data => res.write(data))
您可以使用async/await
(await
仅在async function
内部有效):
async function handleResults() {
res.write(await result1)
res.write(await result2)
}
注意:当心错误(reject
种情况)。在这种情况下,它们变得有些棘手。 (我可以解决)
在nodejs
中,您也可以利用EventEmitter
的功能。您还可以检出rxjs
library为reactive programming
模式实现的Observer
。
答案 1 :(得分:-1)
let file1 = fs.readFile('./file1')
let file2 = fs.readFile('./file2');
file1 = await file1;
file2 = await file2;
res.write(file1)
res.write(file2)
通过这种读取以并行方式进行,但是如果您事先知道file1将变得相对较大,则可以交换await语句。然后,您可以按任意顺序写。