NodeJS中的async.each混淆

时间:2015-12-31 02:45:26

标签: node.js asynchronous

我在NodeJS中迈出了第一步,我遇到了async-module的问题。我有以下代码可以正常工作:

{"error":null,"data":{"albums":["testdir1","testdir2"]}}

这样可以正常工作,并提供预期的输出:

function load_albums(callback) {
    fs.readdir("albums", function(err, content) {
        console.log(content);
        if(err) {
            callback(err);
            return;
        }
        var directories = [];
        async.each(content, function(item, callback2) {
            fs.stat("albums/" + item, function(err,stats) {
                if(stats.isDirectory()) {
                    directories.push(item);
                }
                callback2();
            });
        });
        callback(null, directories);
    });
}

但是,我打算用async.each函数替换迭代器。

我最终得到了这个:

{"error":null,"data":{"albums":[]}}

然而,这似乎不起作用,因为“专辑”现在似乎是空的:

{{1}}

我在这里缺少什么?我想它与调用fs.stats()函数有关,但我不确定我做错了什么。

2 个答案:

答案 0 :(得分:1)

async.each()有三个参数。你没有传递最后一个告诉你何时完成的那个。您还没有在fs.stat()上实现错误处理。你可以改为:

function load_albums(callback) {
    fs.readdir("albums", function(err, content) {
        console.log(content);
        if(err) {
            callback(err);
            return;
        }
        var directories = [];
        async.each(content, function(item, callback2) {
            fs.stat("albums/" + item, function(err,stats) {
                if (!err && stats.isDirectory()) {
                    directories.push(item);
                }
                callback2(err);
            });
        }, function(err) {
            callback(err, directories);
        });
    });
}

答案 1 :(得分:1)

@ jfriend00回答最终回调是asyn.each的第三个参数。目前,此回调正在运行,无需等待async.each完成。

此外,您还要为所有请求提供相册。它们应该在特定资源网址上投放,例如/albums/albums/

我对代码进行了这些修改,现在它会在http://localhost:8080/albums上加载相册,否则会返回“No Content

var http = require('http');
var fs = require('fs');
var async = require('async');

function load_albums(loadCompleteCallback) {
    fs.readdir("albums", function(err, content) {
        console.log(content);
        if(err) {
            callback(err);
            return;
        }
        var directories = [];

        async.each(content, function(item, doneCallback) {
            fs.stat("albums/" + item, function(err,stats) {
                if(stats.isDirectory()) {
                    directories.push(item);
                }
                return doneCallback(err);
            });
        }
        , function (err) {
            loadCompleteCallback(err, directories);
        });
    });
}
function handle_request(request, response) {
    console.log("requested path: " + request.url);
    if(request.url.match(/^\/albums[\/]?$/) ) {
        load_albums(function(err, albums) {
            if (err) {
                response.writeHead(503, {"Content-Type": "application/json"});
                response.end(JSON.stringify(err) + "\n");
                return;
            }
            var out = { error: null,
                        data: { albums: albums}};
            response.writeHead(200, { "Content-Type" : "application/json" });
            response.end(JSON.stringify(out) + "\n");
        });
    } else {
        response.writeHead(200, { "Content-Type" : "application/json" });
        response.end("No Content\n");
    }
}

var s = http.createServer(handle_request);
s.listen(8080);
console.log("server running at : http://localhost:" + 8080);