我正在创建这个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,但在这种情况下,需要选项好几个地方。
谢谢。
答案 0 :(得分:1)
除了无效的语义之外,使用promises控制程序的控制流没有任何内在的错误。
轻微更正
正如我之前所说,代码中存在一些错误的语义和逻辑错误。这是使用内联解释重写代码。
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
}
}
<强>建议强>
当使用promises作为流量控制机制时,它取决于个人偏好。我也遇到了这种设计困境,我已经知道这是非常主观的。作为个人推荐,我会要求您注意如何命名您的方法,并确保您对承诺的使用保持一致。
如果您的getListOfFiles
方法返回一个promise而不是一个Array,那么请确保另一个名为getSomething
的方法也为了一致性而返回一个promise。否则,您和其他阅读代码的人可能会对返回类型感到困惑。一致性是关键,您可以从Selenium等其他主要库中看到这一点。
尽量明确。我建议getListOfFiles
应该返回一个承诺,而不是让getListOfFilesAsync
返回一个承诺。名称getListOfFiles
会建议你返回一个类似数组的对象,但你不是 - 这有点欺骗性,从长远来看可能会伤害到你。尝试向返回promise的函数添加Async
等后缀。