Как проверить ошибку при использовании урожая вместо 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, но я думаю, что это может частично ответить на вашу проблему.