javascript - 可选异步方法的方法提取

标签 javascript ecmascript-2017

我有两种几乎相同的方法,除了其中一个是异步的,并返回一个解决回调方法返回的 promise 的 promise ,而另一个则不是。这两个函数实际上是相同的,但是因为回调是在循环中调用的,所以我对于如何在等待所有 promise 的解析的同时提取公共(public)部分并没有任何好主意。有什么建议吗?

  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)];
}

关于javascript - 可选异步方法的方法提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49767704/

相关文章:

javascript - 我正在尝试向 js 对象添加一个元素

javascript - 异步事件和异常

javascript - 异步抛出 SyntaxError : Unexpected token (

javascript - Ember 无法将参数传递给操作

javascript - 构造函数中的异步函数

javascript - 在 javascript 中在哪里使用 `var` 和 `let`? (不问区别)

node.js - Mocha 不显示 chai 期望错误消息

javascript - 如何映射一对多?

javascript - electron 的 remote.getGlobal() 在 window.location.replace() 之后返回 "undefined"

javascript - 无法在数据库中保存 Facebook 登录用户详细信息