当前位置: 首页 > 知识库问答 >
问题:

如何在异步生成器函数中抛出错误

白子默
2023-03-14

在Javascript中的异步生成器函数中,第一个参数本身就是一个异步生成器函数,该函数用于转换函数。在函数中有一个转换和一个检查。如果检查不正确,应中止发电机功能。如果检查正确,则应得出结果。我用随机数模拟了误差。

我找到了三种抛出错误的方法:

  • 返回Promise.reject(新的错误(一些消息);
  • 抛出新的错误(一些消息。);
  • 产生Promise.reject(新的错误(一些消息);
export async function* transformAsync<T>(
    source: AsyncGenerator<T, void, unknown>,
) {
    for await (const line of source) {

        const transformedLine = transformWithSomeMagic(line);

        if(Math.random() > 0.8) {
            return Promise.reject(new Error("Some Message"));
            // OR
            throw new Error("Some Message.");
            // OR
            yield Promise.reject(new Error("Some Message"));
        }

        yield transformedLine;
    }
}

所有的结果都是相同的。我想知道区别在哪里,当使用streams作为源参数时是否存在泄漏,因为它们是兼容的。

共有2个答案

居京
2023-03-14

是的,它们都一样。没有泄漏,所有泄漏都会关闭迭代器(在迭代器上调用.return())。

你应该使用简单的抛出新的错误(...);显式抛出一个错误自己,其他形式是有用的,当你调用一个promise返回函数和工作与隐式的等待

赵越
2023-03-14

无论阉羊你扔或返回在一个循环中,迭代器将被关闭(无论阉羊是同步还是异步)。

从概念上讲,进一步执行异步生成器的结果表示为promise,返回和让步类似于解决方案,抛出类似于拒绝。现在,用另一个promise来解决一个promise将“压扁”它,因此promise。拒绝包装是多余的。[规格]

        return Promise.reject(new Error("Some Message"));
        // barely equals
        resolve(Promise.reject(new Error("Some Message"))

        throw new Error("Some Message.");
        // barely equals
        reject(new Error("Some Message."));

        yield Promise.reject(new Error("Some Message"));
        // this one's more complicated, but it also barely equals
        resolve(Promise.reject(new Error("Some Message")));
 类似资料:
  • 我有一个异步函数,我希望在失败时抛出异常。然而,似乎有一些东西阻止了这一点: 通过省略try catch块,我希望抛出一个异常,我想在函数外部处理这个异常。 我得到的实际结果有点令人困惑: 当我尝试捕获异常并抛出其他东西时,会得到相同的结果: 该函数是从try块调用的,因此看不到这如何是未处理的promise。 我正在尝试使用< code>f作为另一个函数的参数:

  • 假设我有这样一个函数: 我想测试它是否使用Jest抛出一个(不仅仅是一个)。 然而,这项测试通过了。 如何检查Jest中异步抛出的错误类型?

  • 当捕获异常时,其余代码仍会执行。 我试图用这种方式来捕捉异常,而不是尝试捕捉 我的第一个问题是如何在错误被捕获后阻止代码到达其余代码。 第二个问题是,如果我将Promise reject替换为注释掉的抛出错误,抛出的异常错误将不会被捕获,这是为什么?

  • 问题内容: 查看此代码: 正如您在控制台中看到的那样,“动画”功能是异步的,它“分叉”了事件处理程序块代码的流程。事实上 : 遵循块代码的流程! 如果我希望以此行为创建自己的代码,该如何使用javascript/jquery进行创建?我认为这是不使用的策略 问题答案: 您不能创建真正的自定义异步函数。您最终将不得不利用本机提供的技术,例如: 一些HTML5 API,例如文件API,Web数据库AP

  • 问题内容: 我想使用生成器yield和async函数。我阅读了本主题,并编写了以下代码: 但是我得到了错误: 语法错误:异步函数中的“ yield” 如何在异步功能中使用良率生成器? 问题答案: 更新: 从Python 3.6开始,我们有了异步生成器,能够直接在协程内部使用。 Python 3.5的旧答案: 您不能在协程内部。唯一的方法是使用/ magic方法手动实现异步迭代器。在您的情况下: 输

  • 我有我的spring错误控制器,我需要获得实际的异常类,这样我就可以打印堆栈跟踪和其他类似的东西。这是我的错误控制器 我知道这不多,但我需要Exception对象能够做一些额外的处理。 感谢任何事先的帮助!