【问题标题】:NodeJS Async: Callback already called?NodeJS Async:已经调用了回调?
【发布时间】:2014-08-19 03:34:21
【问题描述】:

我在 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()。您应该在该循环之外完成,它会起作用。您还应该确保在“else if”分支中也调用了 done()。
  • 我从未使用过 Async 模块,但仅查看您的代码,您似乎在循环中多次触发 done()(即您的回调)

标签: javascript node.js asynchronous


【解决方案1】:

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

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

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);
});

【讨论】:

  • 虽然我同意这也是一个问题,但我相信错误(“已调用回调。”)来自循环 done() 中的 else。 OP 可能不想多次执行回调 (done)。
  • 啊,你是对的。两者都是,但看起来它会抛出错误,现在正在修复。
  • 是的,没听懂哈哈。谢谢大家! :)
  • 你应该最后发送return,而不是在每个条件下发送
猜你喜欢
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 2023-03-21
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
相关资源
最近更新 更多