我有一个这样的函数:
var download = function(url, name) {
http.get(url, function(response) {
// part1 : create a new folder if it doesn't exist
dir = './name';
if (!fs.existsSync(dir)){
fs.mkdirSync(dir);
}
// part 2: download and save file into that folder
response.on('data', function (data) {
fs.appendFileSync(dir, data);
});
})
}
我希望第 1 部分在第 2 部分运行之前完成(这样我就可以获得第 2 部分的目录)。我怎样才能做到这一点 ?
(在上面的代码中,据我所知(我是 Node.js 的新手),两个部分将同时运行,所以我不确定第 1 部分总是会在第 2 部分运行之前完成)。
最佳答案
both parts will run simultaneously
不,他们不会。 existsSync
和 mkdirSync
正在阻塞调用。因此,只有在执行它们之后,才会附加事件处理程序。
但是,只要适用,我们就应该利用异步性。在这种情况下,您可以使用 exists
和 mkdir
异步对应项。
所以,你的代码可以像这样松散地重构
function download(url, name) {
function attachAppender(filename, response) {
response.on('data', function (data) {
fs.appendFile(filename, function (err) {
res.statusCode = err ? 500 : 200;
response.end();
});
});
}
http.get(url, function (response) {
var dir = './name';
fs.exists(dir, function (exists) {
if (!exists) {
fs.mkdir(dir, function (err) {
if (err) {
res.statusCode = 500;
res.end();
} else {
// pass the actual full file name
attachAppender(filename, response);
}
});
} else {
attachAppender(filename, response);
}
});
});
}
注意: fs.exists
已弃用,可能很快就会被删除。最好使用 fs.stat
而不是它。
关于javascript - 如何使一些同步代码在其他异步代码之前运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31760231/