1

我定义了一个异步生成器函数,并想创建第二个异步生成器函数,它是第一个函数的部分应用程序。例如,这有效:

async function* fn1(a, b) {/* do something */}

async function* fn2() {
  const a1 = fn1(0, 0);
  for await (const value of a1) {
    yield value;
  }
}

我的问题是:有没有更简洁的定义方式fn2

4

2 回答 2

2

fn1返回正在迭代的异步可fn2迭代对象,因此与其手动迭代 in fn2,您可以只产生从中创建的可迭代对象fn1并让fn2消费者处理它:

async function* fn2() {
  yield* fn1(0, 0);
}

const delay = ms => new Promise(res => setTimeout(res, ms));
async function* fn1(a, b) {
  for (let i = 0; i < 3; i++) {
    await delay(1000);
    yield i;
  }
}

async function* fn2() {
  yield* fn1(0, 0);
}

(async () => {
  for await (const val of fn2()) {
    console.log('Consumer got', val);
  }
  console.log('Done');
})();

// Original version, without yield* (just to illustrate equivalence):

const delay = ms => new Promise(res => setTimeout(res, ms));
async function* fn1(a, b) {
  for (let i = 0; i < 3; i++) {
    await delay(1000);
    yield i;
  }
}

async function* fn2() {
  const a1 = fn1(0, 0);
  for await (const value of a1) {
    yield value;
  }
}

(async () => {
  for await (const val of fn2()) {
    console.log('Consumer got', val);
  }
  console.log('Done');
})();

于 2019-12-06T01:24:28.397 回答
0

最简洁的定义可以通过简单地不制作fn2生成器函数来实现。使用返回生成器的普通函数 - 通过调用创建的生成器fn1

function fn2() {
  return fn1(0, 0);
}
于 2019-12-06T01:57:13.427 回答