如何获得承诺的价值?

我正在查看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

我不清楚这是如何运作的。如果我能调用第一个的结果,链接它们,我知道我可以,那么就是一个承诺对象,类型。它不是 .那么,他们所说的“它的价值将是承诺A增加1的结果”是什么意思呢?.then().then()promiseBObjectNumber

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


答案 1

promiseA的函数返回一个新的 promise (),该 promise () 在解析后立即解析,其值是从 中的成功函数返回的值。thenpromiseBpromiseApromiseA

在这种情况下,使用值解析 - 然后立即使用 的值解析。promiseAresultpromiseBresult + 1

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

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

编辑2019年12月:/现在是JS的标准,它允许上述方法的替代语法。您现在可以编写:asyncawait

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

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

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

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

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


答案 2

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

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

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

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;
});

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