Как проверить ошибку при использовании урожая вместо node -строчного обратного вызова?
Я обволакиваю новые генераторы ecma6 и yield-operator в javascript, особенно в контексте koa.
Рассмотрим надуманный пример:
newUser.save(function(err, user) {
if(err){
//do something with the error
}
console.log("user saved!: " user.id);
}
"Yieldified" выглядит примерно так:
var user = yield newUser.save();
console.log("user saved!: " user.id);
Но как бы я мог проверить существование err
с целью выполнения //do something with the error
?
Ответы
Ответ 1
К сожалению, генераторы сосать для обработки ошибок. Я имею в виду проверку ошибок вручную на каждом шаге и распространение их вручную тоже всасывает, но не так сильно, как оператор try-catch
в Javascript.
try {
var user = yield newUser.save();
console.log("user saved!: " user.id);
}
catch (e) {
//Abstract code that checks if the error is what you think it is
if (isFromNewUserSave(e)) {
}
else {
throw e;
}
}
Проблема с командой try catch, как вы можете видеть, заключается в том, что она ловит все. Существует дополнительная проблема в том, что ошибки, которые были бы ошибками компилятора на других языках, выгружаются в Javascript во время выполнения. Но если вы просто используете try catch без проверок, вы не увидите их вообще.
Ответ 2
Вы должны проверить свою функцию генератора. Там слишком мало контекста для настойчивости распознают вашу проблему с обработкой исключений/ошибок... однако я определил поведение с try/catch:
* Протестировано на Firefox 33.1.1 и Chrome 39.0.2171.65 m
Это НЕПРАВИЛЬНЫЙ способ объявить функцию генератора (без *), и, похоже, это влияет на поведение обработки ошибок:
function wrongGenerator()
{
for(var i = 0; i <= 0 ; i++)
{
if(i < 3)
yield i;
}
}
try
{
var gen = new wrongGenerator();
gen.next();
gen.next();
gen.next();
gen.next();
throw new Error("Test");
}
catch(e)
{
//This should return an Error Object, but it just don't.
console.log(e);
console.log(e instanceof Error);
}
С другой стороны, когда вы правильно объявляете функцию генератора, обработка ошибок работает просто:
function* rightGenerator() {
for(var i = 0; i <= 1; i++)
{
if(i < 3)
var a = yield i;
}
}
try
{
var gen = new rightGenerator();
gen.next();
gen.next();
gen.next();
gen.next();
throw new Error("Test");
}
catch(e)
{
//Returns an Error Object, as expected.
console.log(e);
console.log(e instanceof Error);
}
Не уверен, что это проблема в среде Node, но я думаю, что это может частично ответить на вашу проблему.