JavaScript的Promise命名规范是什么?

67

我觉得为存储JavaScript Promise 的变量制定一个命名规则会很有用。通常情况下,我不喜欢或提倡超出编程语言标准的命名规范,但在 Promise 作为函数参数传递的编程风格中,往往很难一眼看出变量是保存了 Promise 还是“真实的东西”。

个人使用过 promiseOfFoopFoo,但前者有点啰嗦,后者让我想起了匈牙利命名法。

是否有常用的约定俗成的命名规则?


1
fooPromise 怎么样? - jbabey
25
“Froomise” 什么情况? - elclanrs
这篇Tuts文章建议在存储承诺的变量中使用以-ing结尾的动词,表示正在进行的过程:http://msdn.microsoft.com/en-us/library/windows/apps/hh464924.aspx - ejoubaud
1
这篇关于Windows Store应用程序异步编程的文档指出,JS函数返回Promise的约定是以“Async”为后缀:http://msdn.microsoft.com/en-us/library/windows/apps/hh464924.aspx - ejoubaud
4
这个问题不应该被关闭。这个问题并不是“哪种惯例最好”,而是“是否有惯例”。一旦,比如说,Google JavaScript Style Guide涵盖了这个问题,事实上的答案就会是“有”。 - Michael Scheper
显示剩余6条评论
2个回答

22

这更取决于你将如何使用它们,不是吗?

如果你的代码类似于:

var imageLoading = loadImage(url); // returns promise
imageLoading.done(showImage);

// imageLoading.done
// imageLoading.error
// imageLoading.then
// imageLoading.success
// imageLoading.fail
// ... whatever your library supports

那么,我建议给这个Promise起一个类似于现在时态的动词的名称...

但是,如果你正在构建一个依赖于延迟对象的库...

// accepts a promise
var showImage = function (promise) {
    promise.done(function (img) { /* ...... */ });
};

只要明确哪些方法需要 Promise,哪些不需要,将变量命名为名词并没有什么特别的问题。

var image = loadImage(url); // returns promise
showImage(image);           // acts on promise

现在你的接口非常干净,你可以编写看起来100%过程式的代码。 ...但是,你需要知道哪些函数/方法使用Promise,哪些使用对象。

如果你将Promise作为回调函数传递给对象方法中,那么你可以愉快地将它们命名为promisetweetLoadingdataParsing等,在特定情况下,取一个合适的名字即可。

对于showImage的定义,我选择的参数直接称为promise,这样,如果你需要修改该函数或者需要调试一系列的工作流程,你一眼就能看到它需要一个Promise对象。


2
+1. 我喜欢现在分词的想法(“verb-ing”),但只适用于承诺的含义与动作相关的情况(例如dataParsing)。通常,承诺是关于最终结果(数据)的,所以在这些情况下不太适用。我也喜欢将函数参数命名为promise并从上下文中推断其含义的想法。这些都是好主意,但没有约定俗成。 - jevakallio
@fencliff 承诺通常是关于最终结果的,但是订阅承诺的库API都集中在动作“tweet.done(callback)”与“loading.done(callback)”上,因为推迟值的可用性取决于某种动作(即使只是在一段时间后轮询)。这几乎是普遍的。就惯例而言,我真的看不出来有什么规定。写得好读就行了,而不是强制使用新匈牙利命名法或采用“_00_p”前缀/后缀作为标准约定。更多人会理解“loading.finished();”而不是“prefix_X.done();”。 - Norguard
如果你仔细想一想,通过使用现在分词("loading"、"fetching"、"saving")来命名,实际上是在使用后缀约定("ing"),而不是前缀约定("p_"或其他)。没有太大的区别,除了可能对英语读者有一定程度的可读性。许多其他语言没有或未利用现在分词,因此我不确定这是否适用于全球使用的良好约定。 - Beetroot-Beetroot
1
@Beetroot-Beetroot 我同意这是英语的惯例,只有以英语作为他们的[1-n]+后缀语言的人才使用。然而,JavaScript的关键字(和其他保留字)也不适合全球化使用,因为elsecontinue的抽象理解在乌尔都语中并不能真正翻译出来。我知道你的想法,是的,我很挑剔,但如果我们要摆脱语言惯例,为什么不回到汇编语言的位运算呢?“Promise”、“Future”、“Deferred”都做着类似的事情,并且都是基于英语的范例。 - Norguard
@Norguard,毫无疑问,jQuery和编程语言总体而言都与英语紧密相连,但很明显,非英语为母语的程序员倾向于使用他们的母语中的单词/构造来命名变量。与编程语言土著人不同的是,这是我们所有人都可以行使选择的一个方面。 - Beetroot-Beetroot
@Beetroot-Beetroot但是在这里,我们到达了关键点;人们会用自己的语言写出有意义的东西。一个法国程序员不太可能在希腊语编写的代码上工作。匈牙利符号表示法可能在每个人都有intfloatdoublestring等时是有意义的,但是什么是通用的、强类型的promise呢?而且它是一个promise、一个deferred、一个future等吗,因为不同的语言/库有不同的构造,而我通常会自己编写...所以现在我们又回到了语言和构造在其自己的语言中具有意义的问题,所以写出易读的内容。 - Norguard

0

我不知道有哪些公共约定,但是我在自己的代码中使用了以下标准:

  • var dfrd: Deferred 对象(我从未在同一作用域中需要两个或更多)
  • var p: Promise 对象
  • var p_foo: 命名为某个特定用途的 Promise 对象之一
  • var promises: 包含 Promise 对象的数组或普通对象

例外情况是 jqXHR 对象,我将其命名为 var jqXHR(同样,我从未在同一作用域中需要两个或更多)。


4
过于简洁,虽然与匈牙利命名法(https://en.wikipedia.org/wiki/Hungarian_notation)有些相似。 - Tom McKenzie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接