在这项职能中:
function method2(friends, callback) {
//friends is an array of objects
var ids = _.pluck(friends, 'id'),
arrays = cut(ids, 24),
//cut() splits array into smaller arrays of given length
code = require('fs').readFileSync('...').toString();
var imp,j;
async.eachSeries(arrays, function(i, cb1) {
...
vk.request('execute', {code:code}, function(err, resp, body) {
//vk.request passes its callback to node-request module
//at this point, err is null, and body.error is undefined
if(err || body.error) return cb1(err || body.error);
var arr = body.response;
for(var e in arr) {
if(!arr[e]) return cb1();
async.eachSeries(arr[e], function(i, cb) {
...
cb();
}, cb1);
}
})
}, callback);
}函数只调用一次,但异步多次调用回调,而不向其提供任何参数。我看不出有什么理由。那么这个代码有什么问题呢?
发布于 2014-02-28 19:26:53
我想你的问题是:
for(var e in arr) {
// ...
async.eachSeries(/* ... */, cb1);您正在多次调用cb1,这将导致最外层的async.eachSeries多次继续,因此最终的callback将被多次调用。
解决方案:使用async.each而不是简单的for循环来生成多个并发的内部async.eachSeries循环(如果这正是您想要的话)。这是内联嵌套异步循环的方法:
async.eachSeries(/* ... */, function(/* ... */, cb1) {
// this body runs once at a time
async.each(/* ... */, function(/* ... */, cb2) {
// this body runs multiple times 'concurrently'
async.eachSeries(/* ... */, function(/* ... */, cb3) {
// this body runs sequentially,
// but multiple sequential runs can happen at once
cb3(/* ... */);
}, cb2);
}, cb1);
}, callback);一个非主题的好处是:使用readFileSync是不可取的,除非是在应用程序启动时(如果并且只有在使用require是安全的情况下,使用readFileSync也是安全的)。由于您使用的是async调用,所以我必须假设这是一个事务性函数,因此应该使用回调将其更改为fs.readFile。
第二个好处是:当然,太过分了,这种筑巢就变成了一团乱。There are ways to combat this using functional programming techniques.
https://stackoverflow.com/questions/22098267
复制相似问题