2015-05-01 5 views
2

При использовании сторонней библиотеки, которая не зависит от библиотеки async, некоторая обработка ошибки в обратном вызове результатов вызывает произвольный обратный вызов внутри одной из параллельных задач.Javascript 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) 

Кажется, что callback2 каким-то образом используются для обработки исключений в callback3. Но данный bloomjs никогда не использует библиотеку async, я понятия не имею, как это возможно. Мысли?

+1

Вы вызываете ошибку в обратном вызове 'client.find'. 'bloomjs', вероятно, имеет« catch »вокруг вызова обратного вызова, который вызывает его снова с индикацией ошибки. – Barmar

+0

Это может происходить в одной из двух строк, где вы возвращаете переменную err – RobertoNovelo

ответ

2

Я подозреваю, что внутри bloomjs.Client.find, код обратного вызова содержит что-то вроде этого:

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

Так что, когда ваш обратный вызов бросает ошибку hello, это попадает в коде выше, и повторно вызывает client.find обратного вызова. Это снова вызовет cb(), но async.js обнаруживает этот цикл и сигнализирует о собственной ошибке.

Смежные вопросы