javascript callback then()返回已履行/拒绝的承诺

jfgube3f  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(76)

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的解析值将是相同的
作为处理程序返回的承诺的解析值。

jjjwad0x

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是期望用响应对象来解析的未决承诺。

ws51t4hk

ws51t4hk2#

请看下面的例子:

var a = retrieveExternalData();
var b = authenticateCurrentUser();
function f() {
  return a;
}
var p = b.then(f);

a是访问外部资源(数据库或Web服务)并通过从该资源获取数据来实现的承诺。获取数据可能需要一段时间,这就是为什么它是一个承诺。
b是一个承诺,如果当前用户能够进行身份验证,则该用户名将实现该承诺,此时将执行f。(如果用户无法进行身份验证,则拒绝b。)身份验证可能涉及用户键入密码或解出验证码,这就是为什么它是一个承诺。
现在,如果ab履行得更快,那么f返回已经履行的承诺a,并且p得到履行,得到与a相同的结果。
或者,如果外部数据库关闭,a拒绝的速度比b能够实现的速度快,则f返回已经被拒绝的承诺a,并且p被拒绝,并且具有与a相同的错误。
但是如果ab花费更长的时间,则f返回未决的承诺a,并且p的命运尚未决定:它的命运将与a的命运相同。

相关问题