MDN文档指出了then()
可能的return
值,但我不理解用粗体标记的情况。
你能给予我举一个基本的例子吗?也就是说,我如何“复制-模拟”这些案例?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then#return_value
- 返回一个值:p以返回值作为其值来实现。
- 不返回任何内容:p用undefined来满足。
- 抛出一个错误:p被拒绝,抛出的错误作为其值。
*返回已履行的承诺:p得到了实现,承诺的价值就是它的价值
*返回已拒绝的承诺:p会被拒绝,承诺的价值就是它的价值 - 返回另一个挂起的承诺:到那时返回的承诺的履行/拒绝将在
处理程序返回的承诺的解决/拒绝。此外,
到那时返回的promise的解析值将是相同的
作为处理程序返回的承诺的解析值。
2条答案
按热度按时间jjjwad0x1#
p = new Promise(v => v(1)).then(n => n*2);
这意味着
p
是具有值2
的已经解决的承诺。p = new Promise(v => v(1)).then(n => console.log(n));
这意味着它记录
1
,并且p
是值为undefined
的已解析承诺,因为console.log(n)
返回undefined.
p = new Promise((v,x) => x("oops")).then(n => n*2);
这意味着
p
是值为oops
的已拒绝承诺。您应该链接catch
以捕获它。p = new Promise(v => v(Promise.resolve(1))).then(n => n*2);
这意味着
p
是值为2
的已解析承诺。承诺的美妙之处在于,嵌套的已解析承诺被展平,从而产生与第一种情况没有不同的结果。.then
阶段中的错误。p = new Promise((v,x) => x("oops")).then(n => n*2, e => console.log(e));
这意味着
p
是一个已经解决的承诺,其值为undefined
,因为在.then()
的错误处理回调中捕获了前一阶段的拒绝。p = new Promise((v,x) => v(1)).then(n => Promise.reject("oops"), e => console.log(e));
不会被then
阶段中的错误处理程序捕获,也不会被传递到下一阶段错误处理catch
。因此,这取决于“已拒绝承诺”发生在哪个阶段。p = new Promise(v => v(url)).then(url => fetch(url));
这意味着
p
是期望用响应对象来解析的未决承诺。ws51t4hk2#
请看下面的例子:
a
是访问外部资源(数据库或Web服务)并通过从该资源获取数据来实现的承诺。获取数据可能需要一段时间,这就是为什么它是一个承诺。b
是一个承诺,如果当前用户能够进行身份验证,则该用户名将实现该承诺,此时将执行f
。(如果用户无法进行身份验证,则拒绝b
。)身份验证可能涉及用户键入密码或解出验证码,这就是为什么它是一个承诺。现在,如果
a
比b
履行得更快,那么f
返回已经履行的承诺a
,并且p
得到履行,得到与a
相同的结果。或者,如果外部数据库关闭,
a
拒绝的速度比b
能够实现的速度快,则f
返回已经被拒绝的承诺a
,并且p
被拒绝,并且具有与a
相同的错误。但是如果
a
比b
花费更长的时间,则f
返回未决的承诺a
,并且p
的命运尚未决定:它的命运将与a
的命运相同。