【问题标题】:Using Promises inside class method在类方法中使用 Promises
【发布时间】:2017-10-30 08:40:31
【问题描述】:

我正在创建这个 es6 类来组织文件夹中的文档,并且该类有一个用户应该使用的方法:go,例如:

const options = {
 // options here.
};
const organizer = Organizer("path/to/folder", options);

// example
organizer.go().then(() => {

}).catch(console.error);

go 方法中,我使用 Promises 来控制我需要做的事情的流程:

class Organizer {
  constructor(path, options) {
    this.path = path;
    this.options = options;
  }


  go() {
    return Promise.resolve(getListOfFiles())
      .then(doSomethingOne)
      .then(doSomethingTwo)
      .then(etc)
  }

  getListOfFiles() {
    // use this.path to get list of files and return in a Promise way (resolve, reject)
    return new Promise((resolve, reject) => {
    });
  }

  doSomethingOne(files) {
    // something sync
    return .....;
  }

  doSomethingTwo(files) {
    // something async
    return new Promise((resolve, reject) => {
      // ....
    });
  }

  etc() {
  }
}

而且我想知道使用 Promises 控制执行流程是否做错了,我从来没有真正使用 OOP 范式进行编程,我一直使用 FP,但在这种情况下,几个地方都需要选项.

谢谢。

【问题讨论】:

  • Promise 是处理异步操作的合适方式。 go() 不需要 return 它创建的承诺,这样你就可以像你的例子一样说 organizer.go().then(...) 吗?
  • 是的!抱歉,我已经解决了。
  • 对于初学者,您需要在创建实例时使用new,如const organizer = new Organizer("path/to/folder", options);
  • 好的,但是将 Promises 与 OOP 结合使用的重点是什么?
  • 当您有需要监控或协调的异步操作时,您可以选择 Promise。当您有一个要封装数据/方法的对象时,您选择使用 OOP。您可能会选择将两者一起使用(取决于方法的作用),但它们是完全独立的概念,您选择每一个都有其自身的原因。

标签: javascript node.js oop functional-programming ecmascript-6


【解决方案1】:

除了无效的语义之外,使用 Promise 控制程序的控制流本身并没有什么错误。

轻微修正

正如我之前所说,您的代码中存在一些错误的语义和逻辑错误。这是您的代码的重写与内联解释。

class Organizer {
  constructor(path, options) {
    this.path = path;
    this.options = options;
  }

  go() {
    // Use explicit 'this'
    // no need to call Promise.resolve
    return this.getListOfFiles() 
      .then(this.doSomethingOne) 
      .then(this.doSomethingTwo)
      .then(this.etc);
  }

  getListOfFiles() {
    return new Promise((resolve, reject) => {
      // todo
    });
  }

  doSomethingOne(files) {
    // todo
  }

  doSomethingTwo(files) {
    return new Promise((resolve, reject) => {
      // todo
    });
  }

  etc() {
    // todo
  }
}

推荐

当谈到使用 Promise 作为流控制机制时,这取决于个人喜好。我也遇到过这种设计困境,我了解到这是非常主观的。作为个人建议,我会要求您注意如何命名您的方法,并确保您在使用 Promise 时保持一致。

如果您的getListOfFiles 方法返回一个promise 而不是一个数组,那么请确保另一个名为getSomething 的方法也返回一个promise 以保持一致性。否则,您和其他阅读您的代码的人可能会对返回类型感到困惑。一致性是关键,您可以从 Selenium 等其他主要库中看到这一点。

尽量明确。我建议不要让getListOfFiles 返回一个承诺,getListOfFilesAsync 应该返回一个承诺。 getListOfFiles 这个名字暗示你正在返回一个类似数组的对象,但你不是——这有点欺骗性,从长远来看可能会伤害你。尝试为返回 promise 的函数添加诸如 Async 之类的后缀。

【讨论】:

  • 别忘了bind方法回调
  • 谢谢@EvuelDK,你的回答很完美。
猜你喜欢
  • 2018-11-07
  • 2015-06-20
  • 2020-09-08
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多