我正在使用第三方库.哪个使用节点域进行错误处理. 如果传递给该第三方库的回调函数有任何错误,它最终会多次调用我的回调. 示例代码是: var startFunction = function (callback) { //Call thir
如果传递给该第三方库的回调函数有任何错误,它最终会多次调用我的回调.
示例代码是:
var startFunction = function (callback) { //Call thirdParty function and wait for response thirdPartyFunction(function (error, data) { console.log("Called with"); console.log(arguments); //Assume there is an error in my callback function setTimeout(function () { dd callback.apply(null); }, 2000); }); } //ThirdParty function don't modify anything here var thirdPartyFunction = function (callback) { var Domain = require("domain"); var d = require('domain').create(); d.on('error', function (er) { console.log("hi"); callback.apply(null, er); }); d.run(function () { setTimeout(function () { callback.apply(null, [null, "Hello"]); }, 1000); }); }; startFunction(function () { console.log("Got response") });
我们向第三方lib报告了这个错误,他们修改了源代码.喜欢:
d.on('error', function (er) { if (isCalled == false) { isCalled = true; } else { return; } console.log("hi"); callback.apply(null, er); });
现在解决了多次调用函数的问题.但最终的回调永远不会被调用.
如何处理节点的这种行为?
如果第三方lib修改了代码,则会导致应用程序崩溃.放置包装域也无济于事.
d.on('error', function (er) { if (isCalled == false) { isCalled = true; } else { throw new Error("Getting called"); return; } console.log("hi"); callback.apply(null, er); });
在节点中处理此类案例的最佳方法是什么?
您可以将自己的域侦听器附加到回调函数,如下所示:var startFunction = function (callback) { //Call thirdParty function and wait for response thirdPartyFunction(function (error, data) { var d1 = require('domain').create(); d1.on('error', function(er){ console.log("bye"); callback.apply(null, er); }); d1.run(function () { console.log("Called with"); console.log(arguments); //Assume there is an error in my callback function setTimeout(function () { dd callback.apply(null); }, 2000); }); }) }
这样一来,如果出现错误,它将被你的处理程序捕获,并且错误将被发送回主级别而不会被无限循环捕获.