如何访问Promise的value?

IT技术 javascript angularjs promise angular-promise
2021-01-09 02:12:09

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

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像那样访问它还是类似的东西?成功回调如何返回Promise并返回“结果+ 1”?我错过了一些东西。

6个回答

promiseAthen函数返回一个新的promise( promiseB),它在resolved后立即promiseA被resolved,它的值是success函数返回的值promiseA

在这种情况下promiseA,用一个值result解析-然后立即promiseB用 的值解析result + 1

访问 的值的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,因为我们已经使用 展开了 promiseA 的结果await,您可以直接使用它。

但是,await只能在async函数内部使用因此,要稍微缩小,必须像这样包含上述内容:

async function doSomething() {
    let result = await functionThatReturnsPromiseA();
    return result + 1;
}
因此,如果您想使用 Promise 的异步回调的返回值,则必须在另一个异步回调中完成。说得通。我一直在寻找一种方法来获得一些最终的原始返回值,但我认为鉴于上下文,这将无视原因。
2021-03-10 02:12:09
Promise 理论上是它们自己的对象。它们包含可以通过 promise 的成功函数访问的结果。
2021-03-17 02:12:09
答案的第一行立即解决是什么意思?
2021-03-18 02:12:09
@Aerovistae 实际上,ES6 引入了使这成为可能的生成器,而 ES7 引入了异步函数——这两者都为你提供了语法糖,使其看起来像同步代码(通过在后台运行状态机)——所以请抓紧:)
2021-03-30 02:12:09

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

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

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

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

1. Return nothing --> PromiseB is resolved immediately, 
   and undefined is passed to the success handler of promiseB
2. Return a value --> PromiseB is resolved immediately,
   and the value is passed to the success handler of promiseB
3. Return a promise --> When resolved, promiseB will be resolved. 
   When rejected, promiseB will be rejected. The value passed to
   the promiseB's then handler will be the result of the promise
   

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

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

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

.thenpromiseB 的函数接收从.thenpromiseA 函数返回的内容。

这里promiseA 返回的是一个数字,它将作为numberpromiseB 的成功函数中的参数可用然后将增加 1

pixelbits 答案是正确的,您应该始终使用它.then()来访问生产代码中Promise的值。

但是,有一种方法可以在使用以下不受支持的内部 node.js 绑定解析后直接访问 promise 的值:

process.binding('util').getPromiseDetails(myPromise)[1]

警告:process.binding 从未打算在 nodejs 核心之外使用,并且 nodejs 核心团队正在积极寻求弃用它

https://github.com/nodejs/node/pull/22004 https://github.com/nodejs/node/issues/22064

以与您目前的理解略有不同的方式解析评论可能会有所帮助:

// promiseB will be resolved immediately after promiseA is resolved

这表明这promiseB是一个Promise,但将在解决后立即promiseA解决。从另一种角度来看,这意味着promiseA.then()返回分配给 的PromisepromiseB

// and its value will be the result of promiseA incremented by 1

这意味着promiseA解析为的值是promiseB将作为其 successCallback 值接收的值:

promiseB.then(function (val) {
  // val is now promiseA's result + 1
});