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
promiseA的then函数返回一个新的承诺(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)
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)
.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