如何获取承诺的价值?

tem*_*ame 117 javascript promise angularjs angular-promise

我正在从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
Run Code Online (Sandbox Code Playgroud)

我不清楚这是如何工作的.如果我可以调用.then()第一个的结果.then(),链接它们,我知道我可以,那么promiseB是一个类型的promise对象Object.它不是Number.那么他们的意思是"它的价值将是promiseA增加1的结果"?

我应该promiseB.value像那样访问它吗?成功回调如何返回一个承诺并返回"结果+ 1"?我错过了什么.

Nay*_*ish 102

promiseAthen函数返回一个新的承诺(promiseB)被立即解决后promiseA解决了,它的价值是什么,从内成功函数返回的值promiseA.

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

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

promiseB.then(function(result) {
    // here you can use the result of promiseB
});
Run Code Online (Sandbox Code Playgroud)

  • 将 Promise 包装在异步函数中仍然是异步的。如何立即获得已解决的 Promise 的结果? (3认同)
  • 承诺在理论上是他们自己的对象.它们包含一个可以通过promise的成功函数访问的结果. (2认同)
  • 因此,如果您想使用promise的异步回调的返回值,则必须在另一个异步回调中完成.说得通.我一直在寻找一种方法来获得一些最终的原始回报值,但我认为这会违背理由而给出背景. (2认同)
  • @Aerovistae实际上,ES6引入了使这成为可能的生成器,ES7引入了异步函数 - 这两者都为你提供语法糖,使它看起来像同步代码(通过在后台运行状态机) - 所以紧紧抓住:) (2认同)

pix*_*its 17

当一个promise被解决/拒绝时,它会调用它的成功/错误处理程序:

var promiseB = promiseA.then(function(result) {
   // do something with result
});
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

promiseB = promiseA.then(function(result) {
  return result + 1;
});
Run Code Online (Sandbox Code Playgroud)

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


小智 6

之前有一些很好的答案,这里是ES6箭头函数版本:

var something = async() => {
    let result = await functionThatReturnsPromiseA();
    return result + 1;
}
Run Code Online (Sandbox Code Playgroud)

  • 但“someting”是一个异步函数。当评估(`something()`)时,结果是一个`Promise`,所以我们循环...... (9认同)

har*_*shr 5

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

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


小智 5

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

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

process.binding('util').getPromiseDetails(myPromise)[1]
Run Code Online (Sandbox Code Playgroud)

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

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