javascript - 在类方法中使用 Promise

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

我正在创建这个 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() {
  }
}

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

谢谢。

最佳答案

除了无效的语义之外,使用 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,而不是一个 Array,那么请确保另一个名为 getSomething 的方法也返回一个 Promise,以保持一致性。否则,您和其他阅读您代码的人可能会对返回类型感到困惑。一致性是关键,您可以从其他主要库(例如 Selenium)中看到这一点。

尽量明确。我建议 getListOfFiles 返回一个 promise ,而 getListOfFilesAsync 应该返回一个 promise 。名称 getListOfFiles 会建议您返回一个类似数组的对象,但事实并非如此 - 这是一种欺骗性的行为,从长远来看可能会伤害您。尝试向返回 Promise 的函数添加后缀,例如 Async

关于javascript - 在类方法中使用 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44252632/

相关文章:

node.js - node-amqp 无法向 RabbitMQ 发送消息

java - 现实世界中的设计模式

javascript - 仅在元素显示时才需要必填字段

javascript - native js defaultValue 和 jQuery prop(defaultValue) 有(应该有)区别吗?

javascript - 使用 nodemailer angular 6 发送电子邮件

node.js - 如何向除发布者之外的所有订阅者发送消息,发布者也是同一 rabbitMQ 队列上的监听器

javascript - 将 AJAX 响应文件显示到 View 中

javascript - 无法创建对象数组

java - 用对象动态填充 ArrayList

python - 将程序从 FreeBASIC 转换为 Python : globalizing variables