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

验证迭代器与异步迭代器类型

楮自珍
2023-03-14

JavaScript中有没有已知的技巧来区分Iteratorasyncierator之间的区别,而不触发迭代?

我正在尝试实现以下类型检查器:

function isAsyncIterator<T>(i: Iterator<T> | AsyncIterator<T>): boolean {
    // returns:
    //  - true, if i is an asycnronous iterator
    //  - false, if i is a syncronous iterator
}

我知道调用next会告诉我们这一点,但在无法触发迭代时我需要它。

此外,即使我在TypeScript中给出了示例,我也需要在运行时严格检查它。

共有1个答案

司徒瀚
2023-03-14

这是不可能的。迭代器是由一个协议定义的,而不是由一个有形的属性定义的,因此,由于停止问题,在没有实际迭代的情况下,无法确定对象是否是迭代器。另请参见类似的问题:Javascript iterable的技术定义是什么?如何测试它?。

但是,有一些好的启发式方法可以检测大多数表现良好的迭代器实现和所有内置迭代器:

>

  • 迭代器通常是可迭代的(它们不能在for...的循环中使用,否则会限制它们的有用性),并且会为此委托给自己。所以呢

    function isIterator(obj) {
        if (Object(obj) !== obj) return false;
        const method = obj[Symbol.iterator];
        if (typeof method != 'function') return false;
        const iter = method.call(obj);
        return iter === obj;
    }
    function isAsyncIterator(obj) {
        if (Object(obj) !== obj) return false;
        const method = obj[Symbol.asyncIterator];
        if (typeof method != 'function') return false;
        const aIter = method.call(obj);
        return aIter === obj;
    }
    

    迭代器继承自内置的%Iterator原型%。在迭代器助手提议引入全局迭代器构造函数之前,访问和测试这些对象有点麻烦,但这是可能的。

    const GeneratorPrototype = Object.getPrototypeOf(function*() {}).prototype;
    const IteratorPrototype = Object.getPrototypeOf(GeneratorPrototype);
    const AsyncGeneratorPrototype = Object.getPrototypeOf(async function*() {}).prototype;
    const AsyncIteratorPrototype = Object.getPrototypeOf(AsyncGeneratorPrototype);
    
    function isIterator(obj) {
        return IteratorPrototype.isPrototypeOf(obj);
    }
    function isAsyncIterator(obj) {
        return AsyncIteratorPrototype.isPrototypeOf(obj);
    }
    

  •  类似资料:
    • 问题内容: 在一次采访中有人问我,使用迭代器使用for循环有什么好处,或者使用循环比迭代器有什么好处? 任何人都可以回答这个问题,以便将来如果我遇到类似的问题,那么我可以回答 问题答案: 首先,有两种for循环,它们的行为非常不同。一种使用索引: 这种循环并非总是可能的。例如,列表具有索引,而集合没有索引,因为它们是无序集合。 另一个foreach循环在幕后使用Iterator: 这适用于每种It

    • 本文向大家介绍Python迭代器与可迭代与生成器,包括了Python迭代器与可迭代与生成器的使用技巧和注意事项,需要的朋友参考一下 示例 一个迭代是一个对象,可以返回一个迭代器。具有状态且具有__iter__  方法并返回迭代器的任何对象都是可迭代的。也可能是没有状态的对象,该对象实现了__getitem__方法。-该方法可以获取索引(从零开始),并IndexError在索引不再有效时引发。 Py

    • 最常见的类型包括容器类(container class),也称集合类(collection class),是保存一组对象集合的类。容器类通常提供插入、删除、查找、排序和测试类成员项目等操作。数组、堆栈、队列、树和链表都是容器类,第4章介绍了数组,第11章和20章将介绍其他数据结构。 容器类经常与迭代对象(iterator object;或简称迭代器,aerator)相关联。迭代对象返回集合中的下一

    • " 东是东,西是西,东西不相及 " — 拉迪亚德·吉卜林 深入 生成器是一类特殊 迭代器。 一个产生值的函数 yield 是一种产生一个迭代器却不需要构建迭代器的精密小巧的方法。 我会告诉你我是什么意思。 记得 菲波拉稀生成器吗? 这里是一个从无到有的迭代器: [下载 fibonacci2.py] class Fib: '''生成菲波拉稀数列的迭代器''' def __init_

    • 迭代器 乍看来,迭代器似乎很直观。但凑近了看,你会发现标准STL容器提供了四种不同的迭代器:iterator、const_iterator、reverse_iterator和const_reverse_iterator。很快你会注意到在这四种类型中,容器的insert和erase的某些形式只接受其中一种。那是问题的开始。为什么有四种迭代器?它们之间的关系是什么?它们可以互相转化吗?在调用算法和ST

    • For freedom Christ has set us free. Stand firm, therefore, and do not submit again to a yoke of slavery. 基督释放了我们,叫我们得以自由,所以要站立得稳,不要再被奴仆的轭挟制。(GALATIANS 5:1) 迭代器 迭代,对于读者已经不陌生了,曾有专门一节来讲述,如果印象不深,请复习《迭代》。