gpt4 book ai didi

node.js - 了解 `nodejs` 异步文件读取

转载 作者:太空宇宙 更新时间:2023-11-03 23:34:45 25 4
gpt4 key购买 nike

我试图理解nodejs异步行为。考虑一下

### text file: a.txt ###
1. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
{{b.txt}}
3. Donec et mollis dolor.
{{c.txt}}
########################

### text file: b.txt ###
2. Donec a diam lectus. Sed sit amet ipsum mauris.
########################


### text file: c.txt ###
4. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit.
########################

var readFile = function(file) {
fs.readFile(file, "utf8", function (err, file_content) {
if (err) console.log("error: " + err);

file_content.split(/\n/)
.forEach(function(line) {
var found = line.match(/\{\{(.*?)\}\}/);
found ? readFile(found[1]) : console.log(line);
});
});
};

我想要的输出是

1. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
2. Donec a diam lectus. Sed sit amet ipsum mauris.
3. Donec et mollis dolor.
4. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit.

我得到的输出是

1. Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
3. Donec et mollis dolor.
2. Donec a diam lectus. Sed sit amet ipsum mauris.
4. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit.

我该如何解决这个问题?完成此类任务最惯用的方法是什么?

更新:我想在这里指出,我不想使用readFileSyncasync(对于至少现在)。现在,我想了解使用纯 JS 执行此操作的正确方法,并在此过程中更好地了解异步编程。

最佳答案

您本质上要求做的是让逐行迭代等待异步操作readFile(found[1])完成,然后再继续下一行。由于它是一个异步操作,因此它不会暂停您的 Javascript 执行。因为它不会暂停执行,所以 .forEach() 的其余部分继续运行,并且 readFile(found[1]) 的结果与所有内容交织在一起否则正在发生。

解决此类问题的唯一方法是对迭代进行更多控制,以便在处理完当前迭代之前,行的下一次迭代不会继续。您必须停止使用 .forEach() 并进行手动迭代。

以下是有关如何使函数通过手动迭代工作的一般想法:

var readFile = function(file, done) {
fs.readFile(file, "utf8", function (err, file_content) {
if (err) {
console.log("error: ", err);
done(err);
return;
}

var lines = file_content.split(/\n/);
var cntr = 0;

function nextLine() {
var found, line, more = false;
while (cntr < lines.length) {
line = lines[cntr++];
found = line.match(/\{\{(.*?)\}\}/);
if (found) {
readFile(found[1], function(err) {
if (err) {
return done(err);
}
nextLine();
});
more = true;
// break out of the while loop and let this function finish
// it will get called again when the async operation completes
break;
} else {
console.log(line);
}
}
// if we're all done, then call the callback to
// to tell the caller we're done with all async stuff
if (!more) {
done(null);
}
}
// start the first iteration
nextLine();
});
};

// call it initially like this
readFile("somefile.text", function(err) {
if (err) console.log(err);
});

关于node.js - 了解 `nodejs` 异步文件读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34016440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com