如何访问承诺的价值?

新手上路,请多包涵

我正在查看 Angular 文档中 $q 的这个例子,但我认为这可能适用于一般的承诺。下面的示例是从他们的文档中逐字复制的,其中包括他们的评论:

promiseB = promiseA.then(function(result) {
  return result + 1;
});

// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1

我不清楚这是如何工作的。如果我可以在第一个 .then() 的结果上调用 .then() 并将它们链接起来,我知道我可以,那么 promiseB 是一个 Promise 对象,类型为 Object 。它不是一个 Number 。那么“它的值将是 promiseA 加 1 的结果”是什么意思呢?

我应该以 promiseB.value 或类似的方式访问它吗?成功回调如何返回一个承诺并返回“result + 1”?我错过了一些东西。

原文由 temporary_user_name 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 688
2 个回答

promiseAthen 函数返回一个新的 promise ( promiseB ),它在 promiseA 被解析后立即被解析,它的值是从 promiseA 中的成功函数返回的值。

在这种情况下, promiseA 使用 value- result 解析,然后立即使用 result + 1 解析 promiseB

访问 promiseB 的值的方式与访问 promiseA 的结果相同。

 promiseB.then(function(result) {
 // here you can use the result of promiseB
 });


_2019 年 12 月编辑_: async / await 现在是 JS 中的标准,它允许使用上述方法的替代语法。你现在可以写:

 let result = await functionThatReturnsPromiseA();
 result = result + 1;

现在没有promiseB,因为我们已经使用 await 解开了promiseA 的结果,你可以直接使用它。

但是, await 只能在 async 函数内部使用。所以要稍微缩小一点,上面的内容必须像这样包含:

 async function doSomething() {
 let result = await functionThatReturnsPromiseA();
 return result + 1;
 }

而且,为了清楚起见,这个例子中函数 doSomething 的返回值仍然是一个承诺——因为异步函数返回承诺。因此,如果您想访问该返回值,则必须执行 result = await doSomething() ,您只能在另一个异步函数中执行此操作。基本上,只有在父异步上下文中,您才能直接访问从子异步上下文生成的值。

原文由 Nachshon Schwartz 发布,翻译遵循 CC BY-SA 4.0 许可协议

当承诺被解决/拒绝时,它将调用其成功/错误处理程序:

 var promiseB = promiseA.then(function(result) {
   // do something with result
});

then 方法还返回一个承诺:promiseB,它将 根据来自 promiseA 的成功/错误处理程序的返回值 来解决/拒绝。

promiseA 的成功/错误处理程序可以返回三个可能的值来影响 promiseB 的结果:

  1. 什么都不返回 → PromiseB 立即解析,undefined 传递给 promiseB 的成功处理程序
  2. 返回一个值 → PromiseB 立即被解析,并将该值传递给 promiseB 的成功处理程序
  3. 返回一个 promise → 解决后,promiseB 将被解决。当被拒绝时,promiseB 将被拒绝。传递给 promiseB 的 then 处理程序的值将是 promise 的结果

有了这种理解,您可以理解以下内容:

 promiseB = promiseA.then(function(result) {
  return result + 1;
});

then 调用立即返回 promiseB。

当 promiseA 被解析时,它会将结果传递给 promiseA 的成功处理程序。

由于返回值是 promiseA 的结果 + 1,成功处理程序正在返回一个值(上面的选项 2),因此 promiseB 将立即解析,并且 promiseB 的成功处理程序将传递给 promiseA 的结果 + 1。

原文由 pixelbits 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题