NodeJS异步编程:回调函数已被调用?

11

我在Node.JS中使用Async模块来追踪我的异步调用。但是,我遇到了一个错误 - “回调已经被调用。”有人能帮我解决吗?

async.each(data['results'], function(result, done) { 
    if (result['twitter_id'] !== null) { //Isolate twitter handle
        var param = { "user.screen_name": result['twitter_id']}
        db.test4.find( param, function(err, users) {
            if( err ) {
                return done(err);
            } else if (!users) {
                res.send("No user found");
            } else {
                users.forEach( function(Result) { 
                    twitter_ids.push(Result);
                    //console.log(Result);
                    done();
                });
            }
        });
    }
}, function(err) {  
    if (err) {
        throw err
    }
    res.send(twitter_ids);
});

你在forEach循环的每次迭代中都调用了done()。你应该将done()移到循环外部,这样它就能正常工作了。你还应该确保在“else if”分支中也调用了done()。 - aembke
我从未使用过Async模块,但是仅仅看了你的代码,似乎你在循环中多次触发了done()(即你的回调函数)。 - Steve
1个回答

12

每次加载失败时,您都会调用 res.send("No user found");。但是,您可能会多次加载失败。

解决方案是将所有响应代码放在 final 回调中,而不是每个回调中。

async.each(data['results'], function(result, done) { 
    if (result['twitter_id'] !== null) { //Isolate twitter handle
        var param = { "user.screen_name": result['twitter_id']}
        db.test4.find( param, function(err, users) {
            if( err ) {
                done(err);
            } else if (!users) {
                done(new Error("No user found"));
            } else {
                users.forEach( function(Result) { 
                    twitter_ids.push(Result);
                    //console.log(Result);
                });
                done();
            }
        });
    } else {
      done();
    }
}, function(err) {  
    if (err) {
        return next(err);
    }
    res.send(twitter_ids);
});

2
虽然我同意这也是一个问题,但我认为错误(“Callback already called.”)来自于在else中对done()进行循环。原帖作者可能不想多次执行回调函数(done)。 - Steve
1
啊,你说得对。两个都有问题,但是那个看起来像是引发错误的,我现在修复它。 - generalhenry
1
嗯,没听清楚哈哈。谢谢大家! :) - techalicious
你应该在最后发送返回,而不是在每个条件中发送。 - JayminLimbachiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接