【问题标题】:Method extraction for optionally async method可选异步方法的方法提取
【发布时间】:2018-09-20 21:41:38
【问题描述】:

我有 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));
    }
  }

【问题讨论】:

  • 您可以将await 用于非承诺值:let result = await 22 因此,您的同步迭代没有用,只需对两者都使用 iterateAsync。
  • 是的,你可以,但是为了能够使用'await',我必须首先在方法上使用'async'。然后该方法将始终返回一个承诺,如果回调不是异步的,这不是你想要的
  • 在您的示例中,您没有返回任何内容,那为什么会有问题?
  • 第二种方法是异步的,因此它返回一个承诺。第一个实际上不应该返回任何东西。现在我想使用相同的代码来返回一个承诺或什么都不返回

标签: javascript ecmascript-2017


【解决方案1】:

只需为您的实例编写一个迭代器,而不是带有回调的 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)];
}

【讨论】:

  • 我不知道 JS 中的迭代器。好的。看起来合法。谢谢
  • 请注意[Symbol.iterator] 只是您尝试迭代对象时使用的默认方法,如for (… of this)。如果更合适,您也可以使用自己的方法名称,例如 getAllIps*() {…for (… of this.getAllIps())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 2020-12-19
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多