Javascript nodejs中的异步函数

Javascript nodejs中的异步函数,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,这只是一个关于nodejs中异步函数以及创建它们的好方法的小问题。以下参数接受存储库和扩展名,并返回给定存储库中具有给定扩展名的文件列表 运行 $ node app /path/to/some/reposity someExtension module.js文件 //modules.js var fs = require('fs'); var path = require('path'); module.exports = function(dir, ext, callback){ /

这只是一个关于nodejs中异步函数以及创建它们的好方法的小问题。以下参数接受存储库和扩展名,并返回给定存储库中具有给定扩展名的文件列表

运行

$ node app /path/to/some/reposity someExtension
module.js文件

//modules.js
var fs = require('fs');
var path = require('path');
module.exports = function(dir, ext, callback){
    //do something
    fs.readdir(dir, function(err, data){
        if(err){
            //EDIT
            process.nexTick(function(){
                callback(err);
            });
            //
        }
        if(data){
            var compteur = 0;
            var block = [];
            for(var i =0 ; i < data.length ; i++){
                if(path.extname(data[i]).slice(1) == ext){
                    block[compteur]= data[i];
                    compteur++;
                }
            }
            //EDIT
            process.nextTick(function(){
                callback(null, block);
            });
            //
        }

    });
};
//modules.js
var fs=需要('fs');
var path=require('path');
module.exports=函数(dir、ext、callback){
//做点什么
fs.readdir(dir,function(err,data){
如果(错误){
//编辑
process.nexTick(函数(){
回调(err);
});
//
}
如果(数据){
var compteur=0;
var block=[];
对于(变量i=0;i
app.js文件

//app.js
var dir = process.argv[2];
var ext = process.argv[3];
var module = require('./module');

module(dir, ext, function(err, data){
    if(err) { throw err;}
    var dl = data.length;
    for(var i = 0 ; i < dl ; i++){
        console.log(data[i]);
    }
});
//app.js
var dir=process.argv[2];
var ext=process.argv[3];
变量模块=要求('./模块');
模块(目录、分机、功能(错误、数据){
if(err){throw err;}
var dl=data.length;
对于(变量i=0;i
我只是想知道这是做事情的好方法还是有更好的方法。提前谢谢

我发现这个关于NodeJS中异步函数的很好的教程
异步编程的标准方法是使用回调,这就是您正在做的。由于回调嵌套在异步函数中,因此一旦调用堆栈为空,它将排队


另外,不要命名任何变量。这是一个不应该被覆盖的全局变量。

这是一个非常标准的方法,不过您应该知道,
callback()
调用之前的
return
语句实际上没有做任何有用的事情……而且您还有一个额外的右括号
函数(err,data))
@BlueSkies如果这种方法是标准的,那么还有其他方法可以获得相同的结果吗?对于return语句,我看到了有回调和没有回调,我现在更喜欢让它们调用。执行
return callback(..)
是一个好习惯,因为您可能会遇到一个bug,其中
callback(..)
被调用了两次!谢谢,我几天前刚开始使用nodejs,在理解这一点时遇到了一些问题。谢谢,发出事件而不是发送回调更好吗?还是类似?用例取决于您正在做什么。有时一个或两个更方便使用。我实际上没有注意到这一点。谢谢你指出这一点。话虽如此,我将在睡眠不足时停止回答问题。