需要关于节点jsasynchronous无限循环的帮助

我正在尝试这个http://justinklemm.com/node-js-async-tutorial/教程我试着async.parallel() ,我想循环通过一些函数一次又一次。 但它被困在第一,并没有无限循环。 任何人都可以请build议我这个?

编辑:代码:添加2个function,应该一次又一次地削减

 var util = require('util'); var async = require('async'); var SensorTag = require('./index'); var USE_READ = true; SensorTag.discover(function(sensorTag) { console.log('discovered: ' + sensorTag); var items = [9000]; var asyncTasks = []; items.forEach(function(item){ // We don't actually execute the async action here // We add a function containing it to an array of "tasks" asyncTasks.push(function(callback){ console.log('connectAndSetUp'); sensorTag.connectAndSetUp(callback); }), asyncTasks.push(function(callback){ console.log('readDeviceName'); sensorTag.readDeviceName(function(error, deviceName) { console.log('\tdevice name = ' + deviceName); callback(); }); }); }); asyncTasks.push(function(callback){ // Set a timeout for 3 seconds setTimeout(function(){ // It's been 3 seconds, alert via callback callback(); }, 3000); }); //async.parallel(asyncTasks, function(){ //console.log('DONE'); async.parallel(asyncTasks, function(){ // All tasks are done now //doSomethingOnceAllAreDone(); }); }); 

编辑:我想用这个,但不能循环。 可能我错过了node.js中的一些基本问题。 谁能帮我吗?

 var util = require('util'); var async = require('async'); var SensorTag = require('./index'); var USE_READ = true; var count = 0; /*PART 1*/ SensorTag.discover(function(sensorTag) { console.log('discovered: ' + sensorTag); async.series([ function(callback) { console.log('connectAndSetUp'); sensorTag.connectAndSetUp(callback); }, function(callback) { console.log('readDeviceName'); sensorTag.readDeviceName(function(error, deviceName) { console.log('\tdevice name = ' + deviceName); callback(); }); }, function(callback) { console.log('readSystemId'); sensorTag.readSystemId(function(error, systemId) { console.log('\tsystem id = ' + systemId); callback(); }); } ]); }); /*PART 2*/ async.whilst( function () { return count < 5; }, function (callback) { function(callback) { console.log('enableIrTemperature'); sensorTag.enableIrTemperature(); }, function(callback) { setTimeout(callback, 2000); }, function(callback) { console.log('readIrTemperature'); sensorTag.readIrTemperature(function(error, objectTemperature, ambientTemperature) { console.log('\tobject temperature = %d °C', objectTemperature.toFixed(1)); console.log('\tambient temperature = %d °C', ambientTemperature.toFixed(1)); callback(); }); }, function (err) { console.log('5 seconds have passed'); // 5 seconds have passed } count++; setTimeout(callback, 1000); } ); 

我无法循环这一点。 我想要的是在第一部分我会执行这些function,然后在第二部分我将循环所有的function。 我试过recursion,可能不正确,无法执行

setTimeout用于在预定时间之后调用一次。 然而,使用称为recursion的技术来调用无限循环是最好的方法。 例:

 var foo = function() { setTimeout(function() { // do stuff that may take time foo() }, 3000) } 

不要使用setInterval因为它会再次调用,即使它没有完成函数中的其他操作。

你可能需要使用

 setInterval(function(){ callback(); }, 3000) 

setTimeout(),运行一次。

你可以recursion地做到这一点:

 asyncTasks.push(function (callback){ var count = 0; myTask(function fn(err) { if(err || count >= 5) return callback(err); count++; myTask(fn); }); }); 

要么

 asyncTasks.push(function task(callback){ if(err || taskCount >= 5) return callback(err); // assuming taskCount is in the outer scope taskCount++; task(callback); }); 

编辑

你将要写的大部分函数都会有一个callback,因为Node.js是一个持续传递风格的语言,I / O是asynchronous的。

有一个node.jsasynchronous函数的模式,除了任何数量的参数之外,函数都带有一个额外的函数,并带有以下签名:

 // results is optional function(err,[results]){} 

所以函数声明应该如下所示:

 // next() here is the function described above SensorTag.registerEvent = function(event,next) { // Do stuff... // Do more stuf... if(stuffFailed){ // If first param is truthy // something went wrong return next("Some error") } // null as first param mean // implicitly that everything went ok next(null,["some","result"]); }; 

如果在下面的代码被执行之前得到并且错误,你明确地return 。 例如:

 var getCurrentUser = function(callback){ DB.findCurrentUser({ foo: 'always' },function(err,user) { if(err){ return callback(err); } return callback(null,user); }); } getCurrentUser(function(err,userProfile) { if(err){ console.log(err); return; } console.log('OK! We got user: %s',userProfile.id); }); 

asynchronous使用该模式。 这是一个很好的控制stream程库,但是您需要了解如何控制连续stream。

在您的functionSensorTag.discover必须采取一个callback作为第二个参数,让继续继续下去,一旦你完成该function。 另外,如果你想直接插入async ,所有你的其他function应该有相同的签名。

如果你所有的函数(没有发布)都有这个签名,并且你正在处理错误SensorTag.discover可能看起来像这样:

 // This function needs a callback if you wish // to continue your program SensorTag.discover(function(sensorTag) { console.log('discovered: ' + sensorTag); async.series([ sensorTag.connectAndSetUp, sensorTag.readDeviceName, sensorTag.readSystemId ],function(err,tasksData) { if(err){ console.error(err); return; } console.log('All tasks succedded!'); // No external callback to continue }); }); 

如果这三个函数看起来像上面的getCurrentUser示例应该工作。 您所遇到的问题可能在于这些内部function。

Whilst是一样的,但它只需要3个function,其中重要的是中间的那个,应该遵循callback(err)模式。 所以:

 SensorTag.discover(function(sensorTag) { console.log('discovered: ' + sensorTag); var count = 0; async.whilst( function () { return count < 5; }, function (callback) { console.log('count === %d',count); async.series([ sensorTag.connectAndSetUp, sensorTag.readDeviceName, sensorTag.readSystemId ],callback); }, function (err) { // This is our continuation callback // But again, we don't have an external callback } ); }); 

我不知道SensorTag.discoverSensorTag.discover ,但看起来像是在其他地方定义的,并使用函数(?)。 我猜它应该看起来像这样(可以继续):

 SensorTag.discover = function(sensorTag,next) { console.log('discovered: ' + sensorTag); var count = 0; async.whilst( function () { return count < 5; }, function (callback) { console.log('count === %d',count); async.series([ sensorTag.connectAndSetUp, sensorTag.readDeviceName, sensorTag.readSystemId ],callback); }, function (err) { next(err); } ); }); // Then you call it externally SensorTag.discover(mySensorTag,function(err) { if(err){ console.error(err); } // Do more stuff... }); 

我build议你在深入到asynchronous库之前阅读关于Node.js和asynchronous编程模式。 正如我之前所说, asynchronous是非常强大的,但你需要了解这些概念,否则你将永远debugging。