【发布时间】:2014-11-25 20:55:30
【问题描述】:
最近和我的客户,我们选择关注John Papa's AngularJS Style Guide*。
我目前正在检查当前的代码库,以确保没有留下任何匿名函数。但是,我遇到了一些承诺处理程序的情况,这些处理程序需要的参数不是由承诺的响应/拒绝设置,而是由另一个函数或参数设置。我曾尝试在回调中传递这些参数,但失败了。
function testPromise() {
setPromiseAsPending();
var timestamp = new Date().toString();
firstModel.callPromise()
// option 1: use of anonymous functions. works, but not the aim.
// .then(
// function () {
// onPromiseResolved(timestamp);
// },
// function () {
// onPromiseRejected(timestamp);
// }
// )['finally'](setPromiseAsCompleted);
// option 2: naming functions in context. works, but less than ideal in our context.
.then(
function onPromiseResolved() {
secondModel.logPromiseResults('this promise has been resolved on ' + timestamp);
},
function onPromiseRejected() {
secondModel.logPromiseResults('this promise has been rejected on ' + timestamp);
}
)['finally'](setPromiseAsCompleted);
// option 3: passing functions as variables. not good: doesn't work, missing the parameter.
// .then(
// onPromiseResolved,
// onPromiseRejected
// )['finally'](setPromiseAsCompleted);
// option 4: calling functions with parameters. not good: both functions called.
// .then(
// onPromiseResolved(timestamp),
// onPromiseRejected(timestamp)
// )['finally'](setPromiseAsCompleted);
// option 5: how do i pass the parameter to only be used when the function is called?
这里的目标是确保函数内没有声明函数,以便每个函数在同一级别命名和声明。我们的目标是减少函数的长度,尤其是让它们更易于测试。
请参阅上面的代码摘录,如果您有任何建议,请告诉我。请记住,这不是我们使用的代码,而是模拟函数工作方式的最小原型。
如果对您有帮助,也请参阅 the code in github。提前感谢您的帮助。
* 不要就样式指南进行宗教辩论,这不是本问题的主题。
【问题讨论】:
-
我正在查看链接的样式指南,但我没有看到关于在同一级别声明函数并将它们全部命名的意义。命名你的内联函数是一件好事,但不应该不加思索地应用。纯粹的"partials" 是一个很好的例子,说明了不的名称。
-
该风格指南本身在这里使用匿名处理程序来处理承诺:github.com/johnpapa/angularjs-styleguide/blob/master/…。我不确定您要在这里完成什么,但样式指南似乎可以使用选项 1。
-
@hon2a:命名所有函数不仅是一件好事,而且当你有一个庞大的代码库要调试和大约 20 个开发人员时,这是必要的。我可能承认内联部分可能是必要的,但不能避免命名。
-
@BenjaminGruenbaumL 我同意风格指南并不能解决所有情况,但作为一个团队,这就是我们的目标。正如我对 hon2a 所提到的,我可能确实不得不承认在函数/类级别声明所有函数的部分。
-
@user4291649 命名函数的原因是在调试时有可理解的调用堆栈。 不命名仅提供闭包且不执行自己的代码的函数同样重要。
标签: javascript angularjs promise anonymous-function angular-promise