Articles of asynchronous

使用asynchronous和同步呼叫收集结果

我有以下代码。 它基本上扩展了EventEmitter,所以它不是发送事件而是忘记它,它实际上收集结果。 我把它写成这样的答案: EventEmitter的实现,可以让你得到听众的结果? 这个代码的问题是它假定每个监听器都是asynchronous的。 如果其中一个是asynchronous的,那么async.series就会失败。 我的想法是用监听器包装一个函数来检查它的最后一个参数是否是一个函数。 它不是,应该用一个和asynchronous调用类似的函数来包装它。 但是,我没有做到这一点。 帮帮我? var events = require('events'); var util = require('util'); var async = require('async'); // Create the enhanced EventEmitter function AsyncEvents() { events.EventEmitter.call(this); } util.inherits(AsyncEvents, events.EventEmitter); // Just a stub AsyncEvents.prototype.onAsync = function( event, listener ){ return this.on( event, listener ); } // Async emit AsyncEvents.prototype.emitAsync = […]

process.nextTick的常用方法

我应该多久使用一次process.nextTick ? 我理解它的目的(主要是因为这个和这个 )。 根据经验,当我必须调用callback时,我总是使用它。 这是一般的方法,还是有更多的呢? 另外,在这里 : API对于100%同步或100%asynchronous非常重要。 100%同步意味着永远不要使用process.nextTick和100%的asynchronous使用它?

使用stream作为Node.js中的asynchronous队列的input,如何确保queue.drain只被调用一次

我将从stream中读取一系列input,并对每个input执行HTTP GET请求。 为了避免一次创build太多的连接,我使用async.queue来排队这些input。 在所有的input被读取后( end发送到stream),我想收集以前的结果,并产生一个概述。 我目前正在使用queue.drain来达到这个目的。 但在我的情况下,可能会多次调用queue.drain ,因为进程在input时可能被阻塞,并且在发生这种情况时队列将为空。 那么,asynchronous库中有没有什么可以确保queue.drain在处理stream时只调用一次呢? 只要这个function可以实现,我不介意切换到另一个控制stream程。

在迭代器函数中完成所有任务的节点,asynchronous和callback

所以我在async.map集合中执行任务,迭代器函数在对asynchronous任务收集的所有数据执行任务之前执行多个asynchronous任务。 一个快速的伪示例如下所示: var accts=//array of accounts fechted from mongodb async.map(accts,function(acct,callback){ var likes=0; http.get(acct.facebook,function(err,resp){/*add fan count to likes*/}); http.get(acct.twitter,function(err,resp){/*add followers to likes*/}); //mongoose Model named artist artist.update({_id:acct._id},{fans:likes},function(err,acctsUpdate){}); } 我的困惑在于更新mongodb可能会在两个asynchronous任务完成之前发生,因此打破了我的应用程序。 我怎么去做这个?

保存asynchronousfunction的结果供以后使用

我最近开始学习node.js,这是我第一次使用asynchronous函数,但是我无法用头来包装它。 我很难解释我的意思,所以我举个例子。 在下面的代码中,我使用asynchronous库来循环访问一系列twitter用户名,并获取他们最新的tweet(使用twitter库,twitvariables)。 所有的tweet都以结果variables的forms存储在最后一个callback函数中。 相似性是我写的一个函数,它只是返回一个数字。 async.map(screenNames,function(name,callback){ twit.get('/statuses/user_timeline.json', {screen_name: name, count : 1}, function(data) { callback(null,data[0]['text']); }); },function(err,results){ console.log(similarity(results)); }); 现在说我想每隔X秒使用setInterval重复这个操作,并且每次检查用户是否推特新的东西(即,如果我们刚刚得到的推特与我们以前有的不一样),如果他们有,存储他们的新推特等。 我怎样才能存储他们的推文来比较他们与每个迭代的结果呢? 我试图做到以下没有成功。 setInterval(function(){ async.map(screenNames,function(name,callback){ twit.get('/statuses/user_timeline.json', {screen_name: name, count : 1}, function(data) { callback(null,data[0]['text']); }); },function(err,results){ console.log(similarity(results)); }); console.log(results+'outside async'); },2000,[screenNames,similarity]); 这导致了“console.log(results +'asynchronous”);结果未定义“ 然后我试了一下 setInterval(function(){ async.map(screenNames,function(name,callback){ twit.get('/statuses/user_timeline.json', {screen_name: name, count : 1}, function(data) { callback(null,data[0]['text']); }); […]

在node.js中正确放置具有多个asynchronousredis调用的callback

我正在用node.js和redis构build作业队列系统,并试图找出如何最好地将callback实现到这个函数中。 在代码中,我只有cb()调用了3次,这是为了强调我正在讨论的redis调用。 显然,我可以嵌套三个调用(rpush – > sadd – > sadd),但是由于它们不相互依赖,那么这种做法会打败asynchronous处理的目的,不是吗? Queue.prototype.pushJob = function(job, cb) { var that = this; cb = cb || function(err, res) {}; if (job.name) { that.Database.incr("id:jobs", function(id) { //Increment redis variable id:jobs that.Database.client.hmset('job:' + id, { //Callback of incr, set the hash of job:incr "name": job.name, "status": job.status, "payload": job.payload, "priority": job.priority […]

承诺返回值和嵌套

我有一个函数createOne()应该试图find一个MongoDB文档或创build它,如果找不到。 无论哪种方式,都应该返回一个承诺,并用doc解决承诺: var createOne = function(category) { var self = this; return this.findOne({ slug: category.slug }).exec() .then(function(doc) { if (!doc) { return self.create(category); // wait to resolve until document created. } }); }; findOne().exec()和create() (应该)都返回一个promise。 我尝试了很多不同的方法,比如使用Q.fcall,用Q.defer()和其他方法手动创build一个,但是parsing值丢失,或者创build了第二个{ slug: 'foo' } ,即使首先已经存在(?)。 以下是我的通话代码: var data = [ { slug: 'foo' }, { slug: 'bar' }, { slug: […]

Nodejs循环混淆

我不能得到预期的结果,而是结果是非常混乱..也许一些callback魔术或一些asynchronous将在这里做魔术… app.post('/upload', function (req, res) { var phone_add = req.body.phone_add; whatsapp = phone_add.split(','); var i=0; for (i=0;i<whatsapp.length;i++) { message(whatsapp[i],i); } }); function message(whatsapp,i) { var mess = "\"Test automation\""; console.log(whatsapp); command = "yowsup-cli.py -s " +whatsapp+" "+mess+" -c config.txt"; child = exec(command,function (error, stdout, stderr) { if (error !== null) { console.log('exec error: ' + […]

asynchronouscallback循环响应乱序

我在for循环中进行asynchronous调用,我知道响应是asynchronous的,但是我怎样才能以相同的顺序得到我的响应。 这是我的代码: setInterval(function () { callback = function (response) { var temp2 = ''; var str = ""; test = []; console.log('STATUS: ' + response.statusCode); response.setEncoding('utf8'); response.on('data', function (chunk) { str += chunk; }); response.on('end', function () { console.log("end found"); temp2 = JSON.parse(str); for (var i in temp2['build']) { test.push(temp2['build'][i]['id']); var req3 = http.request({ host: […]

Apidevise为一个不安全的asynchronous函数

我读过这是不好的做法混合function中的同步和asynchronous操作(例如http://nodejs.org/api/process.html#process_process_nexttick_callback )。 现在我想要迭代我想要保存在数据库中的文档数组。 保存之前,我需要逐步validation所有文件。 一个特定的validation器可以在api后面创build。 validation函数可以是完全同步的(简单的检查字段,如果它们是doc.sum> 10有效的),但也是asynchronous的(如果我需要获取和validation依赖文档)。 与asynchronous库( https://github.com/caolan/async )我有这样的事情: function validateAll(docs) { async.eachSeries(docs, function (doc, callback) { var async = false; validate(doc, function () { if (async) { callback(); } else { process.nextTick(function () { callback(); }); } }); async = true; }); } function validate(doc, callback) { if (doc.sum < 10) { return […]