我是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:对不起,如果问题是愚蠢的,或者我的英语不好
其中一个原因(存在几个)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
的力量。您还可以查看由reactive programming
为rxjs
library模式实施的Observer
。
let file1 = fs.readFile('./file1')
let file2 = fs.readFile('./file2');
file1 = await file1;
file2 = await file2;
res.write(file1)
res.write(file2)
通过此读取以并行方式进行,但如果您事先知道file1将会相对较大,则可以交换await语句。然后你可以用你想要的顺序写。