P粉6161110382023-08-22 12:43:32
当一个promise被解决/拒绝时,它会调用它的成功/错误处理程序:
var promiseB = promiseA.then(function(result) { // 用result做一些事情 });
then
方法也返回一个promise:promiseB,它将根据promiseA的成功/错误处理程序的返回值来解决/拒绝。
promiseA的成功/错误处理程序可以返回三个可能的值,这些值将影响promiseB的结果:
有了这个理解,你可以理解下面的内容:
promiseB = promiseA.then(function(result) { return result + 1; });
then调用立即返回promiseB。
当promiseA被解决时,它将结果传递给promiseA的成功处理程序。
由于返回值是promiseA的结果+1,成功处理程序返回一个值(上面的选项2),因此promiseB将立即解决,并且promiseB的成功处理程序将被传递promiseA的结果+1。
P粉1551282112023-08-22 00:10:42
promiseA
的then
函数返回一个新的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上下文产生的值。