首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >async.eachSeries回调多次

async.eachSeries回调多次
EN

Stack Overflow用户
提问于 2014-02-28 14:45:22
回答 1查看 2.3K关注 0票数 1

在这项职能中:

代码语言:javascript
复制
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);
}

函数只调用一次,但异步多次调用回调,而不向其提供任何参数。我看不出有什么理由。那么这个代码有什么问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-28 19:26:53

我想你的问题是:

代码语言:javascript
复制
for(var e in arr) {
    // ...
    async.eachSeries(/* ... */, cb1);

您正在多次调用cb1,这将导致最外层的async.eachSeries多次继续,因此最终的callback将被多次调用。

解决方案:使用async.each而不是简单的for循环来生成多个并发的内部async.eachSeries循环(如果这正是您想要的话)。这是内联嵌套异步循环的方法:

代码语言:javascript
复制
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.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22098267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档