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