我正在查看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。它不是一个数字。那么“它的值将是承诺a加1的结果”是什么意思呢?
我应该像承诺的那样访问吗?。价值或类似的东西?如何成功回调返回承诺和返回“结果+ 1”?我遗漏了一些东西。
与你目前的理解略有不同的分析注释可能会有所帮助:
// promiseB will be resolved immediately after promiseA is resolved
这说明承诺b是一个承诺,但它将在承诺a被解决后立即解决。另一种理解方法是,promise .then()返回一个赋值给promiseB的promise。
// 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
});
promiseA的then函数返回一个新的promise (promiseB),它在promiseA被解析后立即被解析,它的值是在promiseA内的成功函数返回的值。
在这种情况下,用值- result解析promiseA,然后立即用值result + 1解析promiseB。
访问promiseB的值的方法与访问promiseA的结果的方法相同。
promiseB.then(function(result) {
// here you can use the result of promiseB
});
截至ECMAScript 2016 (ES7, 2016), async/await是JavaScript的标准,这允许使用上述方法的替代语法。现在你可以这样写:
let result = await functionThatReturnsPromiseA();
result = result + 1;
现在没有了promisb,因为我们已经使用await来解包了来自promisa的结果,并且您可以直接使用它。
然而,await只能在异步函数中使用。因此,为了稍微缩小,上面的内容必须像这样包含:
async function doSomething() {
let result = await functionThatReturnsPromiseA();
return result + 1;
}
而且,为了清晰起见,在这个例子中,函数doSomething的返回值仍然是一个承诺——因为异步函数返回承诺。因此,如果你想访问返回值,你必须执行result = await doSomething(),这只能在另一个异步函数中执行。基本上,只有在父异步上下文中才能直接访问从子异步上下文中产生的值。
当一个promise被解决/拒绝时,它将调用它的成功/错误处理程序:
var promiseB = promiseA.then(function(result) {
// do something with result
});
then方法还返回一个promise: promiseB,它将根据来自promiseA的成功/错误处理程序的返回值被解析/拒绝。
有三个可能的值,promise的成功/错误处理程序可以返回,将影响promise的结果:
什么都不回→承诺立即解决,
undefined被传递给promise eb的成功处理程序
返回一个值→立即解析promise,
并将该值传递给promiseB的成功处理程序
返回承诺→当解决时,承诺将被解决。
当被拒绝时,承诺将被拒绝。传递给
promise的处理程序将是promise的结果
有了这样的理解,你就可以理解以下内容:
promiseB = promiseA.then(function(result) {
return result + 1;
});
然后调用立即返回promiseB。
当promise ea被解析时,它将把结果传递给promise ea的成功处理程序。
由于返回值是许诺ea的结果+ 1,成功处理程序返回一个值(上面的选项2),因此许诺eb将立即解析,许诺eb的成功处理程序将被传递许诺ea的结果+ 1。