Tag: asynchronous

从客户端调用node.js服务时的Race Condition

我有两个节点服务调用:一个是从LDAP组中获取组成员,另一个是获取每个成员的详细信息。 每个调用都是非阻塞的,所以我遇到了一种情况,即有时候我logging的logging与个人检索的细节不匹配。 有没有一个聪明的方法来编码,以防止竞争条件? 有时候它可以正常工作,但是经常在我正在执行下面的控制台日志的行上,我正在迭代的logging与从商店返回的logging不匹配以获取员工详细信息。 这里看看代码: onGroupSelected: function (list, idx, el, record) { var store = Ext.getStore('GroupMembers'); store.getProxy().setUrl('http://people-nodejs.xxx.xxx.com/ldap/group/' + record.get('cn')); var that = this; store.load({ callback: function (records, operation) { var empstore = Ext.getStore('EmployeeDetails'); Ext.each(records, function(rec, ndx) { console.log(ndx + ":" + rec.get('memberUid')); if (rec.get('isMember')) { empstore.getProxy().setUrl('http://people-nodejs.xxx.xxx.com/ldap/user/' + rec.get('memberUid')); empstore.load({ callback: function(emps, op) { console.log(ndx + […]

如何在Node.js中完成所有Web抓取请求后才呈现页面?

我正在使用jsdom (Node.js的networking抓取库)在1到10个Web请求之间的任何地方。 它是这样的: app.get('/results', function(req, res) { jsdom.env( "http://website1.com", ["http://code.jquery.com/jquery.js"], function (errors, window) { // scrape website #1 } ); jsdom.env( "http://website2.com", ["http://code.jquery.com/jquery.js"], function (errors, window) { // scrape website #2 } ); jsdom.env( "http://website3.com", ["http://code.jquery.com/jquery.js"], function (errors, window) { // scrape website #3 } ); } res.render('results', { items: items }); } 在所有jsdom请求完成之后,我收集了所有我需要的信息之后,如何才运行res.render() ? […]

带asynchronous函数的for循环耗尽内存

在开始大喊“不要使用具有asynchronousfunction的循环”之前! 让我说,我知道如何编程循环与asynchronous函数调用callback中的下一个迭代。 但是,如果我对callback不感兴趣,或者只有在前任完成时才处理一个迭代。 在我的情况下,我从XML文件导入大量的logging,并写入到mongoDB。 正常的调用我的“写”function将是这样的: asyncWrite( record, function(err, result) { … }); 现在正如我所说的,我对这个callback没有兴趣(不会出现错误!),也不会在串行过程中出现。 所以我使用了一个for循环,而忽略了callback: for( i=0; i<max; i+=1) { asyncWrite( record_arr[i] ); } 对于max这个完美的作品。 但随着max变大(> 100.000),我最终得到一个“内存不足”的错误。 防止这种情况的唯一方法是回到“正常的”asynchronous循环(callback中的recursion函数调用)。 任何其他的想法?

想要将variables传递给节点asynchronous的映射方法

我使用节点asynchronous,我想传递一个variables的方法,它使用的第二个参数…例如: async.map(submissions, addScore, function(err, submissions) { if (submissions) { return submissions; } }); 我想通过userId与addScore但不知道如何做到这一点。 addScore是我每次提交时调用的方法,它需要一个userId 。

node.js和setTimeout和setInterval – 了解事件循环

为了理解事件循环和函数setTimeout和setInterval,我编写了下面的程序。 该程序的输出是不同于我的预期: 输出是: In F In L Padalia outside all callback1 callback2 From Interval:0 From Interval:1 From Interval:2 From Interval:3 问题: 为什么“全部”不是先执行? 为什么间隔总是最后执行? 有人可以向我解释整个程序的执行吗? 在退出程序之前等待一段时间,为什么? 程序: var Fname = undefined; var Lname = undefined; var count = 0; function F(callback){ console.log("In F"); Fname = "Rushabh"; if(Fname != undefined && Lname != undefined) { console.log(Fname); } […]

如何在Node.js中同步呼叫

我有以下代码片段: var array = [1, 2, 3]; var data = 0; for(var i=0; i<array.length; i++){ asyncFunction(data++); } console.log(data); executeOtherFunction(data); 我期待数据的价值为3,但我认为它是由于asyncFunction 0。 所有asyncFunction调用完成后,如何调用executeOtherFunction ?

了解function(错误,数据)callback

所以我很困惑如何函数(err,数据)callback工作,是第一个参数总是一个error handling程序? 如果你有一些像函数(x,y,z,a,b,c)那么剩下的参数呢? fs.readFile中的数据如何从代码的第一行传递到代码的底部? 或换句话说,fs.readFile的输出如何被放入数据参数? fs.readFile(pathToFile, function (err, **data**) { bufferString = **data**.toString(); 我可以用函数(x,y)和函数(x,y,z,a,b,c)replace函数(err,data) 但只有第二个参数的作品(数据和Y),这只是JavaScript的callback语法? 例如,这是工作代码以asynchronous读取文件并打印给定文件的行数: var fs = require('fs'); var pathToFile = process.argv[2]; var bufferString, bufferStringSplit; function counter(callback) { fs.readFile(pathToFile, function (err, data) { bufferString = data.toString(); bufferStringSplit = bufferString.split('\n'); callback(); }); } function logMyNumber() { console.log(bufferStringSplit.length-1); } counter(logMyNumber);

与asynchronous系列控制stream混淆

我是nodejs.i的新手,我想用两个任务串联。我使用asynchronous模块 var async = require('async'); async.series([ function () { console.log("step 1"); }, function () { console.log('step 2'); }]); console.log("end"); 我期待的结果是 step 1 step 2 end 但结果是 step 1 end 为什么?

需要帮助的思考如何编程asynchronous

我使用NodeJS遍历文件列表,并为每个文件生成一个MD5哈希。 以下是我通常会如何同步做到这一点: // Assume files is already populated with an array of file objects for(file in files) { var currentFile = files[file]; currentFile.md5 = md5(file.path); } 这里的问题是,MD5函数是asynchronous的,实际上有一个callback函数,该函数在为文件生成MD5哈希值后运行。 因此,我所有的currentFile.md5variables都将被设置为undefined。 一旦我得到了所有文件的所有MD5哈希,我将需要移动到另一个函数来处理这些信息。 为了让我asynchronous执行这些代码,代码有多难? 什么是最干净的方式来完成我想要做的事情? 我应该注意到哪些常见的不同方法?

async.waterfall里面的async.apply

我有以下的代码片段 async.waterfall([ // Read directory async.apply(fs.readdir, '../testdata'), // Load data from each file function(files, callback) { async.each(files, loadDataFromFile, callback); } ], function(err) { if (err) { api.logger.error('Error while inserting test data', err); } next(); }); 有没有办法可以取代这件作品: function(files, callback) { async.each(files, loadDataFromFile, callback); } 只是一个function? 就像我上面做的,使用async.apply()我取代了这个: function(callback) { fs.readdir('../testdata', callback); } 我知道我可以创build自己的帮助函数来做到这一点,或者我可以这样做,但我想知道是否有一种方法可以使用像.bind()或.apply()这样的函数。 我想过使用.bind()然后.apply()但这会导致function(loadDataFromFile, files, callback) ,这是不正确的。