可选异步方法的方法提取

Method extraction for optionally async method

我有 2 个几乎相同的方法,除了其中一个是异步的,returns 一个解决回调方法返回的承诺的承诺,另一个不是。这 2 个函数实际上是相同的,但是因为回调是在循环中调用的,所以我真的不知道如何在等待所有承诺的解决方案的同时提取公共部分。有什么建议吗?

  iterate(callback) {
    let firstIteration = true;
    let lastIp;
    while (lastIp = (firstIteration && this.startingIp ? this.startingIp : this.subnet.nextIp(lastIp))) {
      firstIteration = false;
      callback(lastIp, this.subnet.buildProgressData(lastIp));
    }
  }

  async iterateAsync(callback) {
    let firstIteration = true;
    let lastIp;
    while (lastIp = (firstIteration && this.startingIp ? this.startingIp : this.subnet.nextIp(lastIp))) {
      firstIteration = false;
      await callback(lastIp, this.subnet.buildProgressData(lastIp));
    }
  }

只需为您的实例编写一个迭代器而不是带有回调的 iterate 方法,这样调用者可以自己决定如何使用它。

[Symbol.iterator]*() {
  let firstIteration = true;
  let lastIp;
  while (lastIp = (firstIteration && this.startingIp ? this.startingIp : this.subnet.nextIp(lastIp))) {
    firstIteration = false;
    yield [lastIp, this.subnet.buildProgressData(lastIp)];
  }
}
iterate(callback) {
  for (const [ip, progress] of this)
    callback(ip, progress);
}
async iterateAsync(callback) {
  for (const [ip, progress] of this)
    await callback(ip, progress);
}

您可能根本不需要那些 iterate 方法,使用 for … of 会简单得多。

使用生成器函数,您还可以轻松将逻辑简化为

[Symbol.iterator]*() {
  let ip;
  if (ip = this.startingIp)
    yield this.startingIp;

  while (ip = this.subnet.nextIp(ip))
    yield [ip, this.subnet.buildProgressData(ip)];
}