13

我正在考虑新的 ecma6 生成器和 javascript 中的 yield-operator,特别是在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

4

2 回答 2

13

不幸的是,生成器在错误处理方面很糟糕。我的意思是在每一步手动检查错误并手动传播它们也很糟糕,但不如try-catchJavascript 中的语句那么多。

   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 而不进行检查,您将根本看不到它们。

于 2014-01-02T16:54:35.477 回答
-1

您应该检查您的生成器功能。很少有上下文可以断言您的异常/错误处理问题......但是,我已经确定了 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 环境中的问题,但我认为它可以部分回答您的担忧。

于 2014-11-26T00:51:11.833 回答