javascript - 如何使一些同步代码在其他异步代码之前运行?

标签 javascript node.js asynchronous nonblocking synchronous

我有一个这样的函数:

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

不,他们不会。 existsSyncmkdirSync 正在阻塞调用。因此,只有在执行它们之后,才会附加事件处理程序。

但是,只要适用,我们就应该利用异步性。在这种情况下,您可以使用 existsmkdir 异步对应项。

所以,你的代码可以像这样松散地重构

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/

相关文章:

javascript - Jquery,在其父限制内打开div

javascript - 每次在javascript循环上随机数

javascript - 以下公共(public)目录设置有什么问题?

javascript - 在 JavaScript 中缓存对象

javascript - 适用于 Google 协作平台的自定义 CSS/JS

node.js - 更新 mongoose 模型中的一个字段 (node.js)

javascript - Arduino 串行端口提供错误数据?

multithreading - Stroustrup指的是std::async的什么限制?

c# - Page_Load() 可以异步吗

javascript - 返回服务对本地存储的 Angular 数据的 promise