参考Async Node.JS,以下功能是否正常? 我的意思是它写得正确,错误将被处理或在Async Node.JS方面写错了? 如果写错了如何在异步节点中正确写入它?
function genid(callback){
try {
var id = mylib.generate();
callback(null, id);
} catch(err){
callback(err);
}
}
答案 0 :(得分:1)
对于初学者,如果mylib.generate()
同步返回id,我怀疑是否需要异步,它可以简单地为:
function genid(callback){
return mylib.generate();
}
但如果mylib.generate()
是异步的,除非mylib
或mylib.generate
不存在或定义不正确,否则我们如何才能获得错误同步...假设它是异步的:
function genid(callback){
try{
mylib.generate(function(err, id){ // assuming that is how mylib.generate callback is styled
if(err) return callback(err);
callback(null, id);
});
}catch(e){
callback(e);
}
}
或者它可以简单地简化为:
function genid(callback){
try{
mylib.generate(callback);
}catch(e){
callback(e);
}
}
答案 1 :(得分:1)
这样就不会发现所有的错误。测试这个的一个简单方法是编写一些看起来像你的代码。
function main() {
try {
cb();
console.log('This will still run because async.');
} catch (e) {
console.log('This will not run.');
console.log(e);
}
}
function cb() {
setInterval(function() {
throw 'This is an error!';
}, 1000);
}
main();
该代码将中断并且不会被try / catch处理。那么代码捕获了什么?
function cb() {
throw 'This is an error';
setInterval(function() {
throw 'This is an error! But it will not run this time.';
}, 1000);
}
在此代码中,我们更改了cb以立即抛出错误。它还会捕获同步调用的错误。
function cb() {
(function() {
throw 'This will also throw.';
})();
}
现在您已经学习了一些JavaScript内容,我们能做些什么?没有JavaScript语言构造来强制您捕获所有异步错误。 Node有一些东西可以帮助你捕获错误 - 你可以阅读它here。这是一个例子:
process.on('uncaughtException', function(err) {
console.log('Caught exception: ' + err);
});
throw 'An error';
这将捕获抛出的错误。 (确保在抛出错误之前处理错误。)
在异步JavaScript中有一种称为Promises的模式。你不能强迫事物正确捕获,但如果你使用正确实现Promises的库,你可以使用这种模式。
var Promise = require('promise');
function catchThis() {
return Promise.reject(new Error('This is an error'));
}
var p = Promise.resolve(catchThis());
p.then(
//on Success
function() {
console.log('This will never call');
},
// on Error
function(err) {
console.log(err);
}
);
注意,我不是在这里“扔”任何东西。它没有解决我捕获所有随机“抛出”问题,但它给了我一个模型来管理错误,而不会有错误滑倒的风险。注意:ES6(最新的JavaScript标准)本身支持Promise。