以同步方式执行异步调用

Sve*_*obs 30 javascript asynchronous node.js

在过去的几个小时里,我一直试图绕过这个问题,但无法理解.我想我还是要习惯函数式编程风格;)

我编写了一个递归函数,遍历目录结构并对某些文件执行操作.此函数使用异步IO方法.现在我想在整个遍历完成时执行一些操作.

如何在执行所有parse调用但仍使用异步IO功能后确保执行此操作?

var fs = require('fs'),
    path = require('path');

function parse(dir) {
    fs.readdir(dir, function (err, files) {
        if (err) {
            console.error(err);
        } else {                
            // f = filename, p = path
            var each = function (f, p) {
                return function (err, stats) {
                    if (err) {
                        console.error(err);
                    } else {
                        if (stats.isDirectory()) {
                            parse(p);
                        } else if (stats.isFile()) {
                            // do some stuff
                        }
                    }
                };
            };

            var i;
            for (i = 0; i < files.length; i++) {
                var f = files[i];
                var p = path.join(dir, f);
                fs.stat(p, each(f, p));
            }
        }
    });
}

parse('.');

// do some stuff here when async parse completely finished
Run Code Online (Sandbox Code Playgroud)

Phi*_*lev 12

寻找步骤模块.它可以链接异步函数调用并将结果从一个调用传递到另一个.

  • 许多人认为使用"chaining"库(如step或node-seq)会阻碍开发人员对node.js的异步,i/o驱动特性的理解.由于我在节点中看到的绝大多数编程错误都是由于对节点的软件设计模型缺乏了解. (2认同)
  • 另见[Q](https://github.com/kriskowal/q)和[deferred](https://github.com/medikoo/deferred)项目,它们基于延迟/承诺概念,在我看来比简单的函数链更强大. (2认同)