async.whilst中的callback和错误是什么?

我试图使用async.whilst重新生成0和数组长度之间的随机数,直到此索引上的元素的长度大于指定的长度。 我想使用async.whis为此,但语法不完全清楚给我。 我想到做以下事情:

var selectParagraph = function(paragraphs, callback){ var index = Math.floor(Math.random() * paragraphs.length async.whilst( function(){ return paragraphs[index].length < minParagraphLength; }, function(cb) { index = Math.floor(Math.random() * paragraphs.length); }, function(err) { console.log(paragraphs[index]); callback(err, paragraphs[index]); } } 

但是,这是行不通的。 我想这是因为我没有在任何地方使用cb作为第二个函数,但是我不完全知道应该如何使用它。 更改索引后,我只是调用cb()吗? variableserr究竟包含什么?

正如Bergi已经指出的那样 ,你没有做任何asynchronous的事情,而且根本不需要使用。 不过,我会进一步解决你whilst工作时的具体困惑。

whilst的第二个参数是一个可以执行asynchronous操作的函数。 whilst无法知道什么时候该function“完成”了所有需要做的事情。 callback参数是一种信号传递的方式, whilst这个函数已经完成了所有的任务, whilst可以继续下一次迭代。

假设我们想每隔一秒制作一个系列控制台消息。 (这是一个非常人为的例子,但我想不出一个更容易解释的自然例子。)

 var i = 0; async.whilst( function(){ return i < 5; }, function(cb) { setTimeout(function() { console.log(i++); cb(); }, 1000); }, function(err) { console.err("we encountered an error", err); } ); 

在这种情况下,我们调用setTimeout ,然后不执行下一次迭代,直到在setTimeout分辨率中调用cb() 。 如果whilst函数终止的whilst运行下一次迭代,所有setTimeout调用将同时排队,而不是一个接一个地运行。 而是等到函数调用cb()

既然你永远不会在你的代码中调用cb()whilst只是假定函数调度了一个需要很长时间的asynchronous任务。 whilst在第一个函数调用通过调用cb()确认完成之前不会运行下一个迭代。

没有参数的调用cb()表示函数没有问题地完成了它的任务。 如果函数完成了一个错误(无法读取文件,无法访问networking资源),那么你可以提供该错误作为参数为cb (例如cb(new Error("could not reach the server")); )并将错误提供给whilst的第三个函数参数。

我想这是因为我没有使用任何地方的第二个函数的callback

对,就是这样。 async.js希望在完成之后callback,否则不会继续下一次迭代。

但我不完全知道我应该如何使用它

你根本不应该使用它,因为你没有任何asynchronous。 使用标准的do while循环:

 do { var index = Math.floor(Math.random() * paragraphs.length); } while (paragraphs[index].length < minParagraphLength) console.log(paragraphs[index]); callback(null, paragraphs[index]); // not sure where you're getting `callback` from