【问题标题】:Giving a provided Node JS callback my own custom Callback给提供的 Node JS 回调我自己的自定义回调
【发布时间】:2016-02-14 13:20:51
【问题描述】:

首先我想我会在这个很棒的帖子之后解决这个问题:nodeJs callbacks simple example

但是,我仍然不确定如何进行。就像标题暗示的那样:我需要一个回调给一个已经有节点参数传递给它的回调

代码:

    (function() 
         var reqs = { 
         http: require('http'),
         path: require('path'),
         fs: require('fs')
    };

    reqs.http.createServer(function (request, response) {

    response.writeHead(200, {
        'Content-Type': 'text/plain'
    });

    response.end('Hello HTTP!');
    }).listen(8080);

    var printCount = function(count) {
        console.log(count);
    };

    var callCount = function(err, list, callback) {
            var count = 0;
            if(err) throw err;
            // console.log(err);
            for (var i = 0; i < list.length; i++) {
                // console.log(reqs.path.extname(list[i]));
                if(reqs.path.extname(list[i]) === ".png" || reqs.path.extname(list[i]) === ".jpg")
                {
                    count++;
                    console.log(count);
                }
            }
            callback(count);
        };

    //count images from executing directory
    var countImages = function(dirName) { 
        var imageCount = reqs.fs.readdir(dirName, callCount(null, null, printCount));
    };

    countImages(__dirname);

})();

我认为这里的关键是 var imageCount = reqs.fs.readdir(dirName, callCount(null, null, printCount)); 我将 printCount 函数传递给在 fs.readdir 异步执行后回调的同一个函数,但似乎我将 null 传递给它的前两个参数是覆盖自动传递回调 errlist 的 Node 功能。我怎样才能解决这个问题?我只是想计算执行目录中的图像并能够将该值存储在我的主函数中。

对于事件风格的编程来说非常陌生。欢迎任何额外的阅读建议。那里有很多内容,但我真的很想在这个周末开会。谢谢大家!

【问题讨论】:

    标签: javascript node.js callback


    【解决方案1】:

    你不能完全做你正在做的事情,你正在做callCount(null, null, printCount) 执行函数。但是您需要将函数作为回调传递。您想要的是类似于以下内容,它捕获您想要的回调并返回一个函数,您可以将其作为回调传递给您的 api 调用

     var callCount = function(callback) {
                return function(err, list) {
                var count = 0;
                if(err) throw err;
                // console.log(err);
                for (var i = 0; i < list.length; i++) {
                    // console.log(reqs.path.extname(list[i]));
                    if(reqs.path.extname(list[i]) === ".png" || reqs.path.extname(list[i]) === ".jpg")
                    {
                        count++;
                        console.log(count);
                    }
                }
                callback(count);
            }
            }
    

    然后

    reqs.fs.readdir(dirName, callCount(printCount));
    

    【讨论】:

    • 我已经改变了 callCount 的概念,它的工作是返回一个回调,你可以使用 readdir。它本身不是回调。它返回一个函数,该函数接受 errr, list,这正是 readdir 想要的。但它也“捕获”了设置为 printcount 的名为“callback”的变量,所以当 readdir 最终回调时......它应该在调用回调时使用 printcount
    • 因为 readdir 是异步的,它会立即返回......并且稍后它会执行回调。只有在回调中才会知道计数
    • 这很好用!我可以说readdir 首先异步执行,然后调用callCount(同时?)这使得readdir 的第二个参数解析并接受返回的回调,这反过来又调用我的printCount 回调?我想我从概念上得到它。难以言喻。
    猜你喜欢
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多