如何获取promise的值?
P粉116631591
P粉116631591 2023-08-21 13:47:33
0
2
459
<p>我正在查看Angular文档中关于<code>$q</code>的示例,但我认为这可能适用于一般的promise。下面的示例是从他们的文档中直接复制的,包括他们的注释:</p> <pre class="brush:php;toolbar:false;">promiseB = promiseA.then(function(result) { return result + 1; }); // 当promiseA被解决后,promiseB将立即被解决,并且它的值将是promiseA的结果加1</pre> <p>我不清楚这是如何工作的。如果我可以在第一个<code>.then()</code>的结果上调用<code>.then()</code>,将它们链接在一起,我知道我可以这样做,那么<code>promiseB</code>是一个promise对象,类型为<code>Object</code>。它不是一个<code>Number</code>。那么他们所说的“它的值将是promiseA的结果加1”是什么意思?</p> <p>我应该像<code>promiseB.value</code>这样访问它吗?成功回调如何返回一个promise并返回“result + 1”?我漏掉了什么。</p>
P粉116631591
P粉116631591

全部回复(2)
P粉616111038

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

var promiseB = promiseA.then(function(result) {
   // 用result做一些事情
});

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

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

  1. 不返回任何值 → promiseB立即解决,并且undefined被传递给promiseB的成功处理程序
  2. 返回一个值 → promiseB立即解决,并且该值被传递给promiseB的成功处理程序
  3. 返回一个promise → 当promise解决时,promiseB将解决。 当promise被拒绝时,promiseB将被拒绝。传递给promiseB的then处理程序的值将是promise的结果

有了这个理解,你可以理解下面的内容:

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

then调用立即返回promiseB。

当promiseA被解决时,它将结果传递给promiseA的成功处理程序。

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

P粉155128211

promiseAthen函数返回一个新的promise(promiseB),在promiseA解决后立即解决,其值是在promiseA的成功函数中返回的值。

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

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

promiseB.then(function(result) {
    // 这里你可以使用promiseB的结果
});

ECMAScript 2016(ES7, 2016)开始,async/await在JavaScript中成为标准,它允许一种替代上述方法的语法。现在你可以这样写:

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

现在没有promiseB了,因为我们使用await解开了promiseA的结果,并且你可以直接使用它。

然而,await只能在async函数内部使用。所以稍微放大一点,上述代码需要包含在一个函数内:

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

需要明确的是,这个例子中doSomething函数的返回值仍然是一个promise,因为async函数返回的是promise。所以如果你想要访问返回值,你需要使用result = await doSomething(),这只能在另一个async函数内部使用。基本上,在父级async上下文中,你可以直接访问子级async上下文产生的值。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板