-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
338 lines (306 loc) · 24.1 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Promises/A+ 规范 | 中文</title>
<link rel="stylesheet" href="./assets/stylesheet.css">
<link rel="shortcut icon" href="https://promisesaplus.com/assets/favicon.ico">
<link rel="canonical" href="https://promisesaplus.com/">
</head>
<body class="spec">
<h1 id="promisesa">Promises/A+ 规范</h1>
<p id="point-1"><a href="https://promisesaplus.com/#point-1" class="anchor"></a><strong>一个为js promises开放的标准。</strong></p>
<p id="point-2"><a href="https://promisesaplus.com/#point-2" class="anchor"></a><em>promise</em> 表示一个异步操作的实际结果。
与一个promise交互的主要方法是promise的 <code
class="highlighter-rouge">then</code> 方法, then方法接收两个回调函数,第一个回调会在promise兑现时被调用,用于接收promise的最终值,
第二个回调会在promise失败时被调用,用于接收promise不能被兑现的原因。</p>
<p id="point-3"><a href="https://promisesaplus.com/#point-3" class="anchor"></a>本规范详细描述了
<code class="highlighter-rouge">then</code> 方法的行为,提供了一个可操作交互的基础,所有符合 promise/A+ 规范的 promise
都可以依靠该基础来实现。因此这个规范被认为是非常稳定的,尽管 promise/A+ 组织可能偶尔地通过一些较小的向后兼容的改变修订规范,
来解决新发现的一些边界情况。但是,只有在经过仔细的考虑、讨论和测试后,我们才会集成大的或者向后不兼容的更改。</p>
<p id="point-4"><a href="https://promisesaplus.com/#point-4" class="anchor"></a>在历史角度上,Promises/A+ 澄清了早期
<a href="http://wiki.commonjs.org/wiki/Promises/A">Promises/A proposal</a>中的行为条款,
将其扩展到涵盖事实上的行为,并省略了未明确说明或有问题的部分。</p>
<p id="point-5"><a href="https://promisesaplus.com/#point-5" class="anchor"></a>本规范规范没有涉及如何创建
如何创建、兑现或者拒绝promise,而是选择专注于<code class="highlighter-rouge">then</code>方法,未来的工作中,我们可能会提及到这些话题。</p>
<h2 id="terminology"><a href="https://promisesaplus.com/#terminology" class="anchor"></a>术语</h2>
<ol>
<li id="point-6"><a href="https://promisesaplus.com/#point-6" class="anchor"></a>“promise” 是一个包含
<code class="highlighter-rouge">then</code>方法的对象或者函数,该方法符合规范指定的行为。</li>
<li id="point-7"><a href="https://promisesaplus.com/#point-7" class="anchor"></a>“thenable” 是一个定义了
<code class="highlighter-rouge">then</code>方法的对象或者函数。</li>
<li id="point-8"><a href="https://promisesaplus.com/#point-8" class="anchor"></a>“value” 是任意合法的 Javascript 值
(包括 <code class="highlighter-rouge">undefined</code>, thenable, promise)。</li>
<li id="point-9"><a href="https://promisesaplus.com/#point-9" class="anchor"></a>“exception” 是一个由
<code class="highlighter-rouge">throw</code>语句抛出的值。</li>
<li id="point-10"><a href="https://promisesaplus.com/#point-10" class="anchor"></a>“reason” 是一个解释
了为何 promise 被拒绝的值。</li>
</ol>
<h2 id="requirements"><a href="https://promisesaplus.com/#requirements" class="anchor"></a>要求</h2>
<h3 id="promise-states"><a href="https://promisesaplus.com/#promise-states" class="anchor"></a>promise 状态</h3>
<p id="point-11"><a href="https://promisesaplus.com/#point-11" class="anchor"></a>必须是以下三种状态值的其中一种:
pending, fulfilled, 或者rejected。</p>
<ol>
<li id="point-12"><a href="https://promisesaplus.com/#point-12" class="anchor"></a>状态是 pending 时:
<ol>
<li id="point-13"><a href="https://promisesaplus.com/#point-13" class="anchor"></a>可以转换为 fulfilled 或者 rejected。</li>
</ol>
</li>
<li id="point-14"><a href="https://promisesaplus.com/#point-14" class="anchor"></a>当 promise 状态是fulfilled时:
<ol>
<li id="point-15"><a href="https://promisesaplus.com/#point-15" class="anchor"></a>不能转换为其他值。</li>
<li id="point-16"><a href="https://promisesaplus.com/#point-16" class="anchor"></a>必须包含一个不可变的 value/reason。</li>
</ol>
</li>
<li id="point-17"><a href="https://promisesaplus.com/#point-17" class="anchor"></a> promise 状态是rejected 时:
<ol>
<li id="point-18"><a href="https://promisesaplus.com/#point-18" class="anchor"></a>不能转换为其他值。</li>
<li id="point-19"><a href="https://promisesaplus.com/#point-19" class="anchor"></a>必须包含一个不可变的 value/reason。</li>
</ol>
</li>
</ol>
<p id="point-20"><a href="https://promisesaplus.com/#point-20" class="anchor"></a>在这里的“不可变”代表的是值的引用相同。(i.e. 当
<code class="highlighter-rouge">===</code>为真值时)</p>
<h3 id="the-then-method"><a href="https://promisesaplus.com/#the-then-method" class="anchor"></a><code
class="highlighter-rouge">then</code> 方法</h3>
<p id="point-21"><a href="https://promisesaplus.com/#point-21" class="anchor"></a>promise 必须提供<code
class="highlighter-rouge">then</code>方法来访问当前的值或最终的原因。</p>
<p id="point-22"><a href="https://promisesaplus.com/#point-22" class="anchor"></a>promise的 <code
class="highlighter-rouge">then</code>方法接受2个参数:</p>
<div class="language-js highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="nx">promise</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">onFulfilled</span><span class="p">,</span> <span class="nx">onRejected</span><span class="p">)</span>
</code></pre>
</div>
</div>
<ol>
<li id="point-23"><a href="https://promisesaplus.com/#point-23" class="anchor"></a><code
class="highlighter-rouge">onFulfilled</code> and <code class="highlighter-rouge">onRejected</code> 都是可选参数:
<ol>
<li id="point-24"><a href="https://promisesaplus.com/#point-24" class="anchor"></a>If <code
class="highlighter-rouge">onFulfilled</code>不是函数则会被忽略。</li>
<li id="point-25"><a href="https://promisesaplus.com/#point-25" class="anchor"></a>If <code
class="highlighter-rouge">onRejected</code>不是函数则会被忽略。</li>
</ol>
</li>
<li id="point-26"><a href="https://promisesaplus.com/#point-26" class="anchor"></a>If <code
class="highlighter-rouge">onFulfilled</code> 是一个函数:
<ol>
<li id="point-27"><a href="https://promisesaplus.com/#point-27" class="anchor"></a>它必须在<code
class="highlighter-rouge">promise</code> 状态转换为fulfilled后调用,<code class="highlighter-rouge">promise</code>的结果
作为该函数的第一个参数。</li>
<li id="point-28"><a href="https://promisesaplus.com/#point-28" class="anchor"></a>它不能在
<code class="highlighter-rouge">promise</code>被fulfilled前被调用。</li>
<li id="point-29"><a href="https://promisesaplus.com/#point-29" class="anchor"></a>它不能被调用超过一次。</li>
</ol>
</li>
<li id="point-30"><a href="https://promisesaplus.com/#point-30" class="anchor"></a>If <code
class="highlighter-rouge">onRejected</code> 是一个函数:
<ol>
<li id="point-31"><a href="https://promisesaplus.com/#point-31" class="anchor"></a>它必须在<code
class="highlighter-rouge">promise</code>状态转换为rejected后调用rejected <code class="highlighter-rouge">promise</code>的
拒绝原因作为该函数的第一个参数。</li>
<li id="point-32"><a href="https://promisesaplus.com/#point-32" class="anchor"></a>它不能在
<code class="highlighter-rouge">promise</code> 被rejected前被调用。</li>
<li id="point-33"><a href="https://promisesaplus.com/#point-33" class="anchor"></a>它不能被调用超过一次。</li>
</ol>
</li>
<li id="point-34"><a href="https://promisesaplus.com/#point-34" class="anchor"></a><code
class="highlighter-rouge">onFulfilled</code> or <code class="highlighter-rouge">onRejected</code>不能被调用直到
<a href="https://es5.github.io/#x10.3">执行上下文</a> 栈仅包含平台代码时才能被调用。
[<a href="#notes">3.1</a>].</li>
<li id="point-35"><a href="https://promisesaplus.com/#point-35" class="anchor"></a><code
class="highlighter-rouge">onFulfilled</code> and <code class="highlighter-rouge">onRejected</code>必须作为函数被调用
(i.e. 没有 <code class="highlighter-rouge">this</code> 值). [<a
href="#notes">3.2</a>]</li>
<li id="point-36"><a href="https://promisesaplus.com/#point-36" class="anchor"></a><code
class="highlighter-rouge">then</code> 对于同一个promise,可能会被多次调用
<ol>
<li id="point-37"><a href="https://promisesaplus.com/#point-37" class="anchor"></a>如果/当<code
class="highlighter-rouge">promise</code> 是fulfilled, 所有 <code
class="highlighter-rouge">onFulfilled</code>回调函数必须按照最初调用
<code class="highlighter-rouge">then</code>的顺序执行。</li>
<li id="point-38"><a href="https://promisesaplus.com/#point-38" class="anchor"></a>如果/当<code
class="highlighter-rouge">promise</code> 是rejected,所有<code
class="highlighter-rouge">onRejected</code>回调函数必须按照最初调用
<code class="highlighter-rouge">then</code>的顺序执行。</li>
</ol>
</li>
<li id="point-39"><a href="https://promisesaplus.com/#point-39" class="anchor"></a>
<p id="point-40"><a href="https://promisesaplus.com/#point-40" class="anchor"></a><code
class="highlighter-rouge">then</code>方法必须返回一个 promise[<a
href="#notes">3.3</a>]。</p>
<div class="language-js highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code> <span class="nx">promise2</span> <span class="o">=</span> <span class="nx">promise1</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">onFulfilled</span><span class="p">,</span> <span class="nx">onRejected</span><span class="p">);</span>
</code></pre>
</div>
</div>
<ol>
<li id="point-41"><a href="https://promisesaplus.com/#point-41" class="anchor"></a>如果<code
class="highlighter-rouge">onFulfilled</code>或者<code class="highlighter-rouge">onRejected</code>返回了一个值
<code class="highlighter-rouge">x</code>, 则执行
<code class="highlighter-rouge">[[Resolve]](promise2, x)</code>解决过程。(详见下文)</li>
<li id="point-42"><a href="https://promisesaplus.com/#point-42" class="anchor"></a>如果<code
class="highlighter-rouge">onFulfilled</code> or <code class="highlighter-rouge">onRejected</code>抛出一个异常
<code class="highlighter-rouge">e</code>, <code class="highlighter-rouge">promise2</code>必须使用
<code class="highlighter-rouge">e</code>作为转为失败状态的原因。</li>
<li id="point-43"><a href="https://promisesaplus.com/#point-43" class="anchor"></a>如果<code
class="highlighter-rouge">onFulfilled</code>不是一个函数,并且<code
class="highlighter-rouge">promise1</code>已经兑现,<code class="highlighter-rouge">promise2</code>也必须转为兑现状态,同时
使用<code class="highlighter-rouge">promise1</code>的兑现值作为兑现值</li>
<li id="point-44"><a href="https://promisesaplus.com/#point-44" class="anchor"></a>如果<code
class="highlighter-rouge">onRejected</code>不是一个函数,并且<code
class="highlighter-rouge">promise1</code>已经转为失败状态<code class="highlighter-rouge">promise2</code>也必须转为失败状态,同时
使用<code class="highlighter-rouge">promise1</code>的失败原因作为失败原因。</li>
</ol>
</li>
</ol>
<h3 id="the-promise-resolution-procedure"><a href="https://promisesaplus.com/#the-promise-resolution-procedure"
class="anchor"></a>处理过程</h3>
<p id="point-45"><a href="https://promisesaplus.com/#point-45" class="anchor"></a><strong>promise处理过程</strong>
是一个抽象的处理输入的promise和x的操作,表示为<code
class="highlighter-rouge">[[Resolve]](promise, x)</code>。如果<code class="highlighter-rouge">x</code>是一个 thenable
,则尝试让<code class="highlighter-rouge">promise</code>转换为<code
class="highlighter-rouge">x</code>的状态,假设<code class="highlighter-rouge">x</code>的行为至少有点像promise。
否则将使用<code class="highlighter-rouge">x</code>作为<code class="highlighter-rouge">promise</code>fulfilled/rejected的值进行处理。
</p>
<p id="point-46"><a href="https://promisesaplus.com/#point-46" class="anchor"></a>这种 thenable 的特性使得 Promise 的实现更具有通用性,
只要它们暴露了一个符合 promise/A+ 规范的 <code class="highlighter-rouge">then</code> 方法, 这同时也使得遵循 promise/A+ 规范的实现可以
与那些不太规范的实现能共存。
</p>
<p id="point-47"><a href="https://promisesaplus.com/#point-47" class="anchor"></a>要执行<code
class="highlighter-rouge">[[Resolve]](promise, x)</code>操作,需要执行以下步骤:</p>
<ol>
<li id="point-48"><a href="https://promisesaplus.com/#point-48" class="anchor"></a>如果<code
class="highlighter-rouge">promise</code>和<code class="highlighter-rouge">x</code>是同一个引用,
使用<code class="highlighter-rouge">TypeError</code>作为理由拒绝promise。</li>
<li id="point-49"><a href="https://promisesaplus.com/#point-49" class="anchor"></a>如果<code
class="highlighter-rouge">x</code>是一个promise,则采用它的状态:[<a
href="#notes">3.4</a>]:
<ol>
<li id="point-50"><a href="https://promisesaplus.com/#point-50" class="anchor"></a>如果<code
class="highlighter-rouge">x</code>是pending, <code class="highlighter-rouge">promise</code>必须保持pending直到
<code class="highlighter-rouge">x</code>是被fulfilled或者被rejected。</li>
<li id="point-51"><a href="https://promisesaplus.com/#point-51" class="anchor"></a>如果/当<code
class="highlighter-rouge">x</code>是fulfilled,使用x的值兑现<code class="highlighter-rouge">promise。</code></li>
<li id="point-52"><a href="https://promisesaplus.com/#point-52" class="anchor"></a>如果/当<code
class="highlighter-rouge">x</code>是rejected,使用x的值拒绝<code class="highlighter-rouge">promise</code>。
</li>
</ol>
</li>
<li id="point-53"><a href="https://promisesaplus.com/#point-53" class="anchor"></a>否则,如果<code
class="highlighter-rouge">x</code>是对象或者函数
<ol>
<li id="point-54"><a href="https://promisesaplus.com/#point-54" class="anchor"></a>尝试将<code
class="highlighter-rouge">x.then</code>储存至新变量<code class="highlighter-rouge">then</code>(then保持对x.then的引用)[<a
href="#notes">3.5</a>]</li>
<li id="point-55"><a href="https://promisesaplus.com/#point-55" class="anchor"></a>如果访问
<code class="highlighter-rouge">x.then</code>时收到异常<code
class="highlighter-rouge">e</code>,使用e拒绝<code class="highlighter-rouge">promise</code>。</li>
<li id="point-56"><a href="https://promisesaplus.com/#point-56" class="anchor"></a>如果<code
class="highlighter-rouge">then</code>是一个函数,将<code class="highlighter-rouge">x</code>
作为<code class="highlighter-rouge">this</code>调用then方法,且第一个参数为<code
class="highlighter-rouge">resolvePromise</code>,第二个参数为<code
class="highlighter-rouge">rejectPromise</code>,这里:
<ol>
<li id="point-57"><a href="https://promisesaplus.com/#point-57" class="anchor"></a>如果<code
class="highlighter-rouge">resolvePromise</code>以<code
class="highlighter-rouge">y</code>作为第一个参数被回调,执行<code class="highlighter-rouge">[[Resolve]](promise, y)</code>。
</li>
<li id="point-58"><a href="https://promisesaplus.com/#point-58" class="anchor"></a>如果/当<code
class="highlighter-rouge">rejectPromise</code>以<code
class="highlighter-rouge">r</code>作为拒绝原因被回调,则用
<code class="highlighter-rouge">r</code>拒绝<code class="highlighter-rouge">promise</code>。</li>
<li id="point-59"><a href="https://promisesaplus.com/#point-59" class="anchor"></a>如果<code
class="highlighter-rouge">resolvePromise</code>和<code class="highlighter-rouge">rejectPromise</code>
都被调用,或者同一被多次调用,那么第一次调用优先,以后的调用都会被忽略。</li>
<li id="point-60"><a href="https://promisesaplus.com/#point-60" class="anchor"></a>如果调用中<code
class="highlighter-rouge">then</code>抛出了一个异常<code class="highlighter-rouge">e</code>,
<ol>
<li id="point-61"><a href="https://promisesaplus.com/#point-61" class="anchor"></a>如果<code
class="highlighter-rouge">resolvePromise</code>或者<code
class="highlighter-rouge">rejectPromise</code>已经被调用,则忽略。</li>
<li id="point-62"><a href="https://promisesaplus.com/#point-62" class="anchor"></a>否则,
用<code class="highlighter-rouge">e</code>作为原因,拒绝<code class="highlighter-rouge">promise</code>。
</li>
</ol>
</li>
</ol>
</li>
<li id="point-63"><a href="https://promisesaplus.com/#point-63" class="anchor"></a>如果<code
class="highlighter-rouge">then</code>不是一个函数,用<code class="highlighter-rouge">x</code>兑现<code
class="highlighter-rouge">promise</code>。</li>
</ol>
</li>
<li id="point-64"><a href="https://promisesaplus.com/#point-64" class="anchor"></a>如果<code
class="highlighter-rouge">x</code>不是一个函数或者对象,用<code class="highlighter-rouge">x</code>兑现
<code class="highlighter-rouge">promise</code>。</li>
</ol>
<p id="point-65"><a href="https://promisesaplus.com/#point-65" class="anchor"></a>即使promise已经在一个循环thenable链里被resolve,由于<code
class="highlighter-rouge">[[Resolve]](promise, thenable)</code>的递归特性,最终将导致<code
class="highlighter-rouge">[[Resolve]](promise, thenable)</code> 被再次调用, 遵循上面的算法会导致无限递归。规范中
并没有要求强制处理,但是鼓励实现者检测递归并且用一个具有丰富信息的<code class="highlighter-rouge">TypeError</code> 拒绝
reject <code class="highlighter-rouge">promise</code>。[<a href="#notes">3.6</a>]</p>
<h2 id="notes"><a href="https://promisesaplus.com/#notes" class="anchor"></a>说明</h2>
<ol>
<li id="point-66"><a href="https://promisesaplus.com/#point-66" class="anchor"></a>
<p id="point-67"><a href="https://promisesaplus.com/#point-67" class="anchor"></a>"平台代码"指的是引擎,环境,以及 promise 实现代码。
实际上,这个要求确保了<code
class="highlighter-rouge">onFulfilled</code> and <code class="highlighter-rouge">onRejected</code>异步执行,当<code class="highlighter-rouge">then</code>方法被调用后,
事件循环队列有了新的任务。这种特性具体实现可以使用宏任务机制,例如<a
href="https://html.spec.whatwg.org/multipage/webappapis.html#timers"><code
class="highlighter-rouge">setTimeout</code></a> or <a
href="https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/setImmediate/Overview.html#processingmodel"><code
class="highlighter-rouge">setImmediate</code></a>或者微任务机制,例如 <a
href="https://dom.spec.whatwg.org/#interface-mutationobserver"><code
class="highlighter-rouge">MutationObserver</code></a> or <a
href="https://nodejs.org/api/process.html#process_process_nexttick_callback"><code
class="highlighter-rouge">process.nextTick</code></a>. 由于考虑了promise在平台的实现,所以它本身可能包含一个任务调度队列来调用回调函数。
</p>
</li>
<li id="point-68"><a href="https://promisesaplus.com/#point-68" class="anchor"></a>
<p id="point-69"><a href="https://promisesaplus.com/#point-69" class="anchor"></a>在严格模式下,该函数的<code
class="highlighter-rouge">this</code>将是<code class="highlighter-rouge">undefined</code>;
在传统模式下,this将是全局对象。</p>
</li>
<li id="point-70"><a href="https://promisesaplus.com/#point-70" class="anchor"></a>
<p id="point-71"><a href="https://promisesaplus.com/#point-71" class="anchor"></a>如果实现满足规范所有要求,则可允许<code
class="highlighter-rouge">promise2 === promise1</code>,但每一个实现都必须明确指出<code
class="highlighter-rouge">promise2 === promise1</code> 会在怎样的条件下出现。</p>
</li>
<li id="point-72"><a href="https://promisesaplus.com/#point-72" class="anchor"></a>
<p id="point-73"><a href="https://promisesaplus.com/#point-73" class="anchor"></a>通常,只有符合本规范的promise
that <code class="highlighter-rouge">x</code>才是真正的promise。
This clause allows the use of implementation-specific means to adopt the state of known-conformant promises.</p>
</li>
<li id="point-74"><a href="https://promisesaplus.com/#point-74" class="anchor"></a>
<p id="point-75"><a href="https://promisesaplus.com/#point-75" class="anchor"></a>首先存储对
<code class="highlighter-rouge">x.then</code>这一引用,然后测试引用是否有效,然后调用该引用,避免了多次访问
<code class="highlighter-rouge">x.then</code>属性,这种预防措施对于确保访问器属性的一致性非常重要,
因为访问器属性的值可能在两次访问中改变。</p>
</li>
<li id="point-76"><a href="https://promisesaplus.com/#point-76" class="anchor"></a>
<p id="point-77"><a href="https://promisesaplus.com/#point-77" class="anchor"></a>实现
<em>不应该</em>限制thenable链的深度。只有真正的死循环才应该引发一个<code
class="highlighter-rouge">TypeError</code>;如果遇到了一个明确的截然不同的无限调用链,那么无限执行下去才是正确的行为。</p>
</li>
</ol>
<hr>
<p xmlns:dct="http://purl.org/dc/terms/" xmlns:vcard="http://www.w3.org/2001/vcard-rdf/3.0#" id="point-78"><a
href="https://promisesaplus.com/#point-78" class="anchor"></a>
<a rel="license" href="https://creativecommons.org/publicdomain/zero/1.0/">
<img src="./assets/88x31.png" style="border-style: none;" alt="CC0">
</a>
<br>
在法律允许的范围内,
<a rel="dct:publisher" href="https://github.com/promises-aplus">
<span property="dct:title">Promises/A+ 组织</span></a>放弃
<span property="dct:title">Promises/A+ Promise规范</span>的所有版权和相关或相邻的权利。
本规范被公布于:
<span property="vcard:Country" datatype="dct:ISO3166" content="US" about="https://github.com/promises-aplus">
美国</span>.
</p>
<script src="./assets/"></script>
</body>
</html>