首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Javascript异步生成器

Javascript异步生成器
EN

Stack Overflow用户
提问于 2018-01-05 02:31:34
回答 1查看 141关注 0票数 2

是否可以编写一个异步生成器,如下所示:

代码语言:javascript
复制
function gen() {
  return async function * () {
    yield await ...
    yield await ...
    yield await ...
  }()
}

所以可以像这样使用它,例如:

代码语言:javascript
复制
for (let val of await gen()) {
  ...
}

我真的不能理解这个结构的语义,异步生成器是如何在循环中使用的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-20 06:32:29

在异步迭代提案完成之前,您可以从Redux-saga书(就像Cory Danielson提到的)中学习一页,并拥有一个适配器函数来执行所有异步/等待内容。

代码语言:javascript
复制
const later = async (delay, value) => {
    return new Promise(resolve => {
        setTimeout(() => resolve(value), delay);
    });
};

function* rangePromise() {
    for (let i = 2; i < 10; i++) {
        let nextValue = yield later(100, i);
        yield nextValue;
    }
}

const forEachAsyncAdapter = async (iterator, ...callbacks) => {
    try {
        let next = iterator.next();
        while (!next.done) {
            while (!next.done && next.value && next.value.then) {
                next = iterator.next(await next.value);
            }
            if (!next.done) {
                await callbacks.reduce(
                    async (nextValue, callback) => {
                        nextValue = await callback(await nextValue);
                        return nextValue;
                    },
                    Promise.resolve(next.value)
                );
                next = iterator.next();
            }
        }
    } finally {
        if (typeof iterator.return === 'function') {
            iterator.return();
        }
    }
};


forEachAsyncAdapter(
    rangePromise(),
    async i => { console.log(i); return Array(i).join('a'); },
    async s => { console.log(s); return s.toUpperCase(); },
    async s => { console.log(s); }
);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48101479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档