给提供的 Node JS 回调我自己的自定义回调

Posted

技术标签:

【中文标题】给提供的 Node JS 回调我自己的自定义回调【英文标题】:Giving a provided Node JS callback my own custom Callback 【发布时间】: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 功能。我怎样才能解决这个问题?我只是想计算执行目录中的图像并能够将该值存储在我的主函数中。

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

【问题讨论】:

【参考方案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 回调?我想我从概念上得到它。难以言喻。

以上是关于给提供的 Node JS 回调我自己的自定义回调的主要内容,如果未能解决你的问题,请参考以下文章

带有回调的自定义插件

Scala 中的自定义 Flyway 回调

JS 当html改变时触发事件

Node.JS:如何将变量传递给异步回调? [复制]

Sails ORM(水线)回调中的自定义错误

将额外变量传递给回调函数