我正在使用第三方库.哪个使用节点域进行错误处理. 如果传递给该第三方库的回调函数有任何错误,它最终会多次调用我的回调. 示例代码是: 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);
});
})
}
这样一来,如果出现错误,它将被你的处理程序捕获,并且错误将被发送回主级别而不会被无限循环捕获.
