2 javascript oop functional-programming node.js ecmascript-6
我正在创建这个 es6 类来组织文件夹中的文档,该类有一种用户应该使用的方法:go,例如:
const options = {
// options here.
};
const organizer = Organizer("path/to/folder", options);
// example
organizer.go().then(() => {
}).catch(console.error);
Run Code Online (Sandbox Code Playgroud)
在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() {
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道我使用 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
}
}
Run Code Online (Sandbox Code Playgroud)
推荐
当谈到使用 Promise 作为流量控制机制时,这取决于个人喜好。我也遇到过这种设计困境,并且我了解到它是相当主观的。作为个人建议,我要求您谨慎命名方法,并确保对承诺的使用保持一致。
如果您的getListOfFiles方法返回一个承诺而不是一个数组,那么请确保调用的另一个方法getSomething也返回一个承诺,以保持一致性。否则,您和其他阅读您代码的人可能会对返回类型感到困惑。一致性是关键,您可以从其他主要库(例如 Selenium)中看到这一点。
尽量明确。我建议不要getListOfFiles返回一个承诺,而getListOfFilesAsync应该返回一个承诺。这个名字getListOfFiles暗示你正在返回一个类似数组的对象,但事实并非如此——这是一种欺骗,从长远来看可能会伤害你。尝试添加后缀,例如Async返回承诺的函数。