Tag: closures

如何用闭包保存variables状态

我有一个函数,我需要调用几次,这个函数将追加我的HTML元素: class MyClass { somefunct(elements) { const father = $("#father").find("#other-element"); for (let element of elements) { father.append(element); } } } 我想避免在每次通话中初始化父亲。 怎么会这样? 我在做什么: somefunct(elements) { const father = $("#father").find("#other-element"); this.somefunc = (elements) => { for (let element of elements) { father.append(element); } } } 这将会起作用,但我不知道这是否是一种不好的做法,或者是否有更好的方法。 谢谢。

返回从NodeJS监听器派生的值

我有一个函数内的NodeJS readstream监听器,我试图让我的函数返回一个从监听器中派生的值(文件的内容)。 例如: MyObj.prototype.read = function(){ var file3 = fs.createReadStream('test.txt',{encoding:'utf8'}); var contentRead =''; file3.addListener('data',function(data){ contentRead + = data.toString('utf-8'); 返回contentRead; }); } 我想要做一些像var contents = myDerivedObj.read()来返回文件的内容。 但是,从监听器内部的返回没有得到正确的返回 – 得到“未定义”。 而且,从监听器外部返回只是返回一个空string。 我不能改变read()的签名,所以我不能添加一个callback作为参数。

在NodeJS中callback之外的variables

我对NodeJS和JavaScript一般都比较陌生。 这是我的脚本: var data = []; client.query( 'SELECT * FROM cds', function selectCb(err, results, fields) { if (err) { throw err; } console.log(results); console.log(fields); data.push(results); } ); console.log(data); 我怎样才能访问callback以外的results (或data )var? 运行查询时,我不希望在对方内写入大量的callback。

在套接字消息(socket.io/node.js)上调用函数

当我启动一个新的GameServer实例时,它将如下设置套接字和侦听器。 var GameServer = function() { this.player = new Player(); var that = this; // Setup sockets and listeners var socket = io.listen(8000); socket.sockets.on('connection', function(client) { client.on('message', that.onSocketMessage); client.on('disconnect', that.onSocketDisconnect); }); } 然后我有两个原型GameServer.prototype.onSocketMessage&onSocketDisconnect。 我现在的代码有两个问题: 用这个=这个和闭包? function。 看起来很丑。 当onSocketMessage被调用时,这个想法是什么消息,然后调用GameServer中的另一个函数。 只有这是不可能的,因为这属于socket.io系统。 见下文: … function onSocketMessage() { this.player.move(); } this.player不再可用。 不再是GameServer的一部分。 我的套接字设置和消息传递是否应该在GameServer函数和原型之外进行处理? 或者我可以怎样解决这个问题? 干杯 编辑 好,所以我已经试过这个,它的工作,但看起来很丑陋我想: var socket […]

在javascript中返回不同范围之间的值

我是Javascript的新手,也是经验丰富的程序员,我正在努力地抓住最好的结构的模式和devise的概念,以build立应用程序时使用和方法。 一些领域对我来说相当新颖,一个是掌握Javascript的范围和closures。 所以为了让这个尽可能的干净,你们这些人,我已经附上了一个代码样本,希望有人可以把我的逻辑放在一个地方,给我一个指导思想和思考的权利。 我发布的代码是一个非常简单的文件系统/帮助程序库(Node.js,express)的一部分,用于扫描目录,在这些目录上运行一些条件,并返回结果作为地图维度数组到另一个库(不张贴)。 你看到的代码是我目前的“testing”条件。 我已经评论过了。 要点: https : //gist.github.com/jimmiehansson/6235613 (全视图或代码/库) 示例代码块(在返回值时出现问题) ApiFS.prototype.scan = function(){ var self = this; var b; fs.readdir(stgs.fsPath, function(err,folders){ if(folders.length<1) { console.log(errLog.fsEmpty); return; } rslt = self.walk(folders); rslt.forEach(function(itm){ if(!self.exclusion(rslt)){ b=self.loader(stgs.fsPath,itm); } }); }, ioResponse); console.log(b); // undefined <—- } 那么足够的破冰。 我最大的问题: 无论我做什么,范围(吊装)和相当小的封闭都妨碍我。 我目前不使用吸气剂或二聚物,因为我根本不知道该怎么做? 我的逻辑完全失效,还是缺less一些相当重要的东西? 在代码中,您将看到scan()原型函数对每个返回true / false值或数组的函数“helper”进行一次调用。 我可以简单地通过返回值到主扫描()函数,但我不能为我的生活从fs.readdir()函数返回的值返回范围外,例如ioResponsecallback之外。 什么是我的逻辑错过了,我怎么能更好地处理这个问题(即使这意味着重build每一件事情)我担心,我正在做一些非常错误的devise和布局这些函数的方法,以及如何处理它们之间的值。 任何援助非常感谢!

推迟在node.js中执行asynchronous消息传递函数

我有一系列经过解码的多段线返回的纬度/经度对。 使用forEach我提取每个纬度/经度对和使用pubnub.publish() ,发送这个数据到一个通道。 pubnub.publish()是一个asynchronous函数,我需要在每一步通过forEach循环来延迟发布消息。 我已经查看了setTimeout立即执行的很多答案,并尝试了下面的不同版本,包括不封装setTimeout在闭包中,但无法延迟发布 – 它只是尽快发送它们。 任何人都可以指出任何明显的错误? decodedPolyline.forEach(function (rawPoints) { var value = { lat: rawPoints[0], lng: rawPoints[1] }; var sendmsg = function () { pubnub.publish({ channel: id, message: value, callback: function (confirmation) { console.log(confirmation); }, error: function (puberror) { console.log('error: ' + puberror); } }); }; (function() { setTimeout(sendmsg, 2000); })(); normalised.push(value); });

在节点jsclosures不按预期工作

我有这段代码: var responses = []; for( var i=0; i < Number(process.argv[2]); i++) { responses.push(function () { var index = i; function bar() { console.log(index); } return bar; }()); } responses.forEach(function(d){ d(); }); 通过使用临时variablesindex来创build闭包。 如预期的那样输出0 1 ,打印我要在闭包中捕获的值。 与http get callback类似的代码不起作用。 var http = require("http"); var urls = ["http://yahoo.com","http://google.com"]; for( var i=0; i < urls.length; i++) { […]

这个nodejs代码是一个循环引用吗?

它们只是来自node.js官方文档的几行。 client.on('data', function(data) { console.log(data.toString()); client.end(); }); 我认为客户端对象已经引用了callback,callback对客户端对象有一个闭包引用。 那是对的吗? 如果是的话,为什么这是鼓励?

有人可以解释一个函数从howtonode包装成语吗?

我最近开始使用node.js,express&mongodb。 由于快递使用连接提供中间件支持,我开始阅读中间件和连接。 我在howtonode.org上遇到了下面的例子: return function logItHandle(req, res, next) { var writeHead = res.writeHead; // Store the original function counter++; // Log the incoming request console.log("Request " + counter + " " + req.method + " " + req.url); // Wrap writeHead to hook into the exit path through the layers. res.writeHead = function (code, headers) […]

处理node.jscallback的最佳实践

我正在创build一个JavaScript类,并在这个函数中使用了node.js中的encryption模块。 我不确定哪个是最好的方法来处理callback。 看看例子并解释。 Users.prototype.makeSalt = function(callback){ crypto.randomBytes(64, callback); }; 要么 Users.prototype.makeSalt = function(callback){ crypto.randomBytes(64, function(err, buf){ if (err) callback(err); callback(null, buf); }); }; 哪一个是首选方法还是最佳实践? 在第一个中,我将callback直接发送到模块中定义的函数,并让它处理callback。 在第二个我通过接收函数的callback自己处理callback。 我觉得第一个是首选,除非我需要任何定制。 但我在node.js和javascript的技能方面非常新手,所以想知道两种方法之间的区别,哪一个会更好?