【问题标题】:Javascript Async calls unrelated callback in parallelJavascript Async 并行调用不相关的回调
【发布时间】:2023-04-10 10:34:01
【问题描述】:

当使用不依赖于async 库的第三方库时,以某种方式处理结果回调中的错误会调用并行任务之一内的任意回调。

例如。

var async = require('async'),
    bloomjs = require('bloom-js');
var client = new bloomjs.Client({url: "http://localhost:3005/api"});

async.parallel([function (cb) {
  console.log('callback1');
  client.find('usgov.hhs.npi', '1558490003', function (err, results) {
    console.log('callback2');
    if (err) return cb(err);
    cb(results);
  });
}], function (err, results) {
  console.log('callback3');
  throw "hello";
  if(err) return console.dir(err);
  console.dir(results);
});

生成输出

callback1
callback2
callback3
callback2

/Users/untoldone/Source/async-demo/node_modules/async/lib/async.js:30
            if (called) throw new Error("Callback was already called.");
                              ^
Error: Callback was already called.
    at /Users/untoldone/Source/async-demo/node_modules/async/lib/async.js:30:31
    at /Users/untoldone/Source/async-demo/node_modules/async/lib/async.js:251:21
    at /Users/untoldone/Source/async-demo/node_modules/async/lib/async.js:575:34
    at /Users/untoldone/Source/async-demo/demo.js:9:21
    at /Users/untoldone/Source/async-demo/node_modules/bloom-js/src/bloom.js:117:18
    at IncomingMessage.<anonymous> (/Users/untoldone/Source/async-demo/node_modules/bloom-js/src/bloom.js:219:22)
    at IncomingMessage.EventEmitter.emit (events.js:117:20)
    at _stream_readable.js:920:16
    at process._tickCallback (node.js:415:13)

似乎回调 2 以某种方式被用于处理回调 3 中的异常。但鉴于bloomjs 从未使用async 库,我不知道这怎么可能。想法?

【问题讨论】:

  • 您在 client.find 回调中抛出错误。 bloomjs 可能在对回调的调用周围有一个 catch,该回调再次调用它并显示错误指示。
  • 这可能发生在您返回错误变量的两行之一中

标签: javascript asynchronous async.js


【解决方案1】:

我怀疑在bloomjs.Client.find 内部,回调代码包含如下内容:

try {
    callback(false, result);
} catch (e) {
    callback(e, result);
}

所以当你的回调抛出 hello 错误时,这会被上面的代码捕获,并重新调用 client.find 回调。这将再次调用cb(),但async.js 检测到此循环并发出自己的错误信号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-18
    • 2017-12-17
    • 2013-11-23
    • 2020-11-19
    • 2014-08-19
    相关资源
    最近更新 更多