<分区>
我在想,在 JavaScript 的函数中总是返回 promises 是不是一种好方法?
让我们想象一下我们有一个验证用户名的函数的情况。主函数仅使用执行不同检查的其他 2 个函数。
请注意,所有函数名称只是示例。
// Returns a boolean
function validateUsername (username) {
return validateUsernameFormat(username) &&
isUsernameReserved(username);
}
// Returns a boolean
function validateUsernameFormat (username) {
return typeOf(username) === 'string' &&
username.match(/^\[a-z0-9]{8,20}$/);
}
// Returns a boolean
function isUsernameNotReserved (username) {
return ['igor', 'kristina'].indexOf(username) === -1;
}
现在让我们想象一下,我们在未来通过调用 API 来检查给定的用户名是否已经存在于我们的数据库中来增强我们的验证。
// Now returns a promise
function isUsernameNotReserved (username) {
return API.checkIfUserNameAlreadyExists(username);
}
这意味着我们现在还必须更改主 validateUsername
函数,因为它现在也需要返回 promise。这也可能意味着我们将不得不修改所有使用 validateUsername
函数的函数。
但是如果我们从头开始在 promises 中实现所有功能呢?
选项 A - 所有函数返回 promise
// Returns a promise
function validateUsername (username) {
return validateUsernameFormat(username)
.then(() => {
return isUsernameReserved(username);
});
}
// Returns a promise
function validateUsernameFormat (username) {
return (
typeOf(username) === 'string' && username.match(/^\[a-z0-9]{8,20}$/) ?
Promise.resolve() : Promise.reject()
);
}
// Returns a promise
function isUsernameNotReserved (username) {
return (
['igor', 'kristina'].indexOf(username) === -1 ?
Promise.resolve() : Promise.reject()
);
}
现在,如果我们想通过异步 API 调用来扩充 isUsernameNotReserved
,我们不需要更改任何其他内容。
选项 B - 只有调用另一个函数的函数返回 promise
此外,另一种选择是在调用另一个函数的 promise 中编写函数。在那种情况下,只有 validateUsername
应该从头开始写成一个 promise。
这是一个好方法吗?除了性能之外还有哪些缺点?
Upd:运行了一个简单的性能测试,虽然运行 consequent promises 速度较慢,但实际上应该没有什么区别,因为运行 100000 个后续函数需要大约 200 毫秒,而在 Chrome 中运行 1000 个需要大约 3 毫秒。在这里 fiddle https://jsfiddle.net/igorpavlov/o7nb71np/2/