Articles of asynchronous

Node.js中的POST正文和一些asynchronous条件检查

我想从http.ServerRequest获取请求(POST)主体,但是当我的请求函数被调用时,请不要直,而是在一段时间之后(Redis查询)。 我有一个非常简单的例子来说明: var http = require('http'), sys = require('sys'); http.createServer(function (req, res) { sys.puts("Got request"); req.pause(); setTimeout(function() { // In real code I'm accessing Redis here. var body = ""; req.addListener('data', function (chunk) { sys.puts("Got 'data' event"); body += chunk; }); req.addListener('end', function () { sys.puts("Got 'end' event"); res.writeHead(200, {'Content-Type': 'text/plain'}); res.end(body); }); req.resume(); }, […]

将数据注入asynchronouscallback(使用node.js)

我正试图围绕如何使asynchronous编程工作。 在我目前的使用情况下,我有可能被调用的函数每秒多次,他们有callback,依靠多个variables之间可能会改变。 一个简单的例子:(为了简洁起见,使用coffeescript) doSomething = (requestor, thing, action, callback) -> thing.takeAction action, (result) -> # actually a lot of times this nests down even further requestor.report result callback result 如果在thing.takeAction返回其结果之前doSomething被多次调用不同的数据, 我认为我不能依赖于请求者和callback仍然是我需要它们的相同的东西。 正确? 为了避免这种情况,我需要以某种方式将请求者和callback注入takeAction的callback函数。 这有可能吗? 我有这样的想法 doSomething = (requestor, thing, action, callback) -> thing.takeAction action, (result, _requestor = requestor, _callback = callback) -> _requestor.report result _callback […]

NodeJS – 强制用户等待全局事件完成

我有一个节点服务器,执行以下操作: 我有一个外部服务器的URL列表,称之为URLServer。 当用户点击我的NODE服务器时,我的节点服务器向URLServer发出请求并获得20个URL的列表。 只要我们获得了这20个URL,我想让我的节点服务器去获得每个URL的标题,这意味着我将获取URL并创build一个DOM,然后提取标题,我也获得其他数据,所以这是它必须完成的方式。 一旦我这样做了,我想要的URL和URL的标题保存在内部存储器和/或数据库。 所以我有一个URLcaching和一个标题caching(我不想总是抓取URL)。 我有这样的事情:如果(URLcaching为空)从URLServer获取URLS并caching这些URL 然后我想检查每个URL,看看他们的标题是否在我的caching中,所以我这样做:对于每个URL如果标题caching[URL],其他获取网站,创buildDOM,提取标题+其他数据和caching 这对于一个用户来说效果很好,但是当我在服务器上尝试一个很重的负载时,服务器就会挂起。 我得出结论服务器挂起的原因如下: 用户1请求 – 空的高速caching – 获取URL并完成获取URL的内容用户2请求 – 由于用户1的请求尚未完成,所以对于该用户来说,高速caching仍为空。 因此,用户2再次强制取回URL和它们各自的内容。 用户3请求 – 用户1和用户2请求尚未完成,所以相同的问题… 因此,假设我有10个URL需要提取,而不是打开10个连接,每个URL一个,然后caching数据,如果我有20个用户在同一时间点击服务器,我将打开200个连接(每个用户打开10个连接)。 如何阻止用户X(其中X> 1)导致这些事件? 我基本上希望服务器closures一个门,并要求每个用户等待,直到它已经填充caching,然后打开门,一旦这些填充,有没有办法做到这一点?

从多级JSON(使用async.js)recursion创build目录

定义 File#createDirectoriesFromJSON (json, cb); json:JSON对象。 cb:function。 参数:error(Error),created(布尔值,如果至less有一个目录已经创build,则为true)。 假设File类包含一个名为_path的属性,其中包含一个目录的path。 用法 var json = { b: { c: { d: {}, e: {} }, f: {} }, g: { h: {} } }; //this._path = "." new File (".").createDirectoriesFromJSON (json, function (error, created){ console.log (created); //Prints: true //callback binded to the File instance (to "this"). Hint: cb […]

Node.JS:forEach vs for循环asynchronous性质

for(var i=0;i<50;i++) { functionWrappingAsycfuncs(i) } var nums = [0,1…50] nums.forEach(functionWrappingAsyncfuns) functionWrappingAsycfuncs(i){ readFileAsync(i,function(){ console.log(i); }); } 在上面的函数中,在for循环中运行它的预期性质是50 50次? 但随着forEach它logging1 2 3 …. 这两个实现看起来都一样,但是确实有不同的任务第一个函数调用所有asynchronous函数,0到50作为参数,但并不等待callback完成 但第二个(在我的项目之一)似乎等待callback,并继续在数组中的下一个项目? 他们都一样吗?

是否可以在nodejs中使用一些同步代码

我明白,对于I / O操作(即数据库查询,Web请求和磁盘访问),您必须使用这样的callback fs = require('fs') fs.readFile('test.txt', 'utf8', function (err,data) { if (err) { return console.log(err); } console.log(data); }); 但是要说你是否有这样的代码同步 function Player(name){ this.name = name; this.score = 0; } Player.prototype.calcScore = function(){ //some special code here to calculate the score this.score =+ 10; } var player = new Player("Sam"); player.calcScore(); console.log(player); 或者,你需要写在像下面这样的callback风格,calcScore方法只包括一个for循环和一个if语句,不会查询数据库等。 function Player(name){ this.name […]

设置和访问asynchronous函数中的全局对象

这样的代码: fileArray = ['a.json','b.json','c.json'] dict = {} fileArray.map (f) -> fs.readFile f, (err, data) -> json.parse data, (k, v) -> dict[k] = v 我想写dict对象到一个文件。 我如何等待所有的asynchronousfunction完成? 或者还有什么其他的办法来做到这一点?

清理Javascript / Nodejs代码

我是新来的JavaScript / nodejs,我正在努力清理它的一些代码。 我正在使用asynchronous nodejs库来处理使代码的asynchronous部分更容易。 现在代码看起来像这样: Object.prototype.method = function(){ var self = this; // bunch of code async.forEach(self.someArr, function(someObj, callback){ self.somefunc(someObj.someProp, function(err, aNewObj) { if (err) { return callback(err); } self.someOtherArr.push(aNewObj.someOtherProp); callback(); }); }, callback); } 不过,我想用另一个在对象原型上定义的命名函数replace匿名函数。 由于代码结构的方式,我不知道如何创build一个新的函数传递到async.forEach同时保持适当的self价值。 我想要它看起来像: AnObject.prototype.method = function(){ var self = this; // bunch of code async.forEach(self.someArr, self._newMethod, callback); } AnObject.prototype._newMethod […]

如何确定一个asynchronous调用是否是最后一个

使用asynchronous语言(在我的情况下是node.js ),我最终会得到一个二维循环和一个response : firstArray.forEach(function(first){ sencondArray[first].forEach(function(second){ doStuff(function callback(resultSum){ if(isLastCallback(this)) response.send(resultSum); }); }); }); 我的第一个方法是获得isLastCallback的正确结果,使用提供的计数器i isLastCallback迭代,但结果是一团糟。 检测当前callback是否是最后一个callback的常用方法是什么?

与NodeJS和Neo4jasynchronous行为的问题

我是一个自学的新手程序员,使用Angular.js,Node.js和graphics数据库neo4j。 现在我试图得到一个非常基本的查询来执行并返回数据到客户端。 执行后,我得到一个closures服务器的错误。 接收到获取请求后执行以下function: exports.test = function (req, res) { var neo4j = require('neo4j'); var db = new neo4j.GraphDatabase('http://localhost:7474'); var query = [ 'MATCH n', 'RETURN n.name, n, labels(n)' ]; db.query(query, function (err, results) { if (err) {throw err}; var data = results.map(function(result) { return result; }); res.send(data) } )}; 我在控制台日志中得到以下错误:java.lang.ClassCastException:java.util.ArrayList不能转换为java.lang.String (我可以提供整个日志,如果它会certificate是有用的) 我将非常感激任何见解。