我想我对 Promises 的理解有 99%:它基本上与观察者模式“相似”,即“当值准备好时,通知我(调用我给你的回调函数)”,除了你可以订阅它晚了,它仍然会通知你,而且它只发生一次。
然而,当我到达
async function()
时,我有时会感到困惑:await
并不是真正的“等待”。它更像是一个notifyMeLaterWhenReady
。当我们调用一个异步函数时,就像它立即返回一样,返回一个承诺,当它到达这个异步函数的末尾时,这个承诺在最后解决。 (或者当它提前返回时)。
就像:
async foo() => {
const a = await bar();
const b = await wah(a);
return lala(a, b); // lala is a regular function (not async)
}
等价于
function foo() {
return new Promise((resolve, reject) => {
let a, b;
bar()
.then(v => { a = v; return wah(a); })
.then(v => { b = v; resolve(lala(a, b)); });
};
}
这是如何理解异步函数以及将异步函数近乎完美地转换为 Promise 范式?翻译后才觉得我理解了99%。 (有一些复杂的
catch
、finally
和 throw
、try
、catch
,我有时会忽略这些,因为我的许多同事不进行错误处理,只是假设它是网络故障和代码对此无能为力。
翻译几乎完成,但缺少
catch
完整性条款:
function foo() {
return new Promise((resolve, reject) => {
let a, b;
bar()
.then(v => { a = v; return wah(a); })
.then(v => { b = v; resolve(lala(a, b)); })
.catch(reject); // Reject the promise returned
};
}
await
运算符的承诺操作数拒绝,await
抛出错误。async
构造的 try/catch
函数中捕获,则使用该值(由 async
函数本机代码)拒绝调用函数时返回的 Promise 对象。引擎盖下:
await
仅返回承诺操作数的成功结算值 - 或非承诺操作数的实际值。如果需要特定的错误处理,您可以在 try/catch
语句周围使用 await promise
结构,或者开始在 catch
函数中使用带有 async
子句的承诺链(这看起来有点奇怪)。finally
子句需要明确链接到 async
正文中的 promise 值,或者取决于可能添加到从异步函数返回的 promise 的具体情况。Promise.resolve(returnValue)
try/catch
捕获,否则函数调用者(同步)返回相当于Promise.reject( thrownValue)
.await
运算符被执行。函数调用者同步返回一个挂起的承诺。 await
在复制其调用上下文并返回事件循环等待等待承诺的解决之前,篡改调用堆栈以恢复调用代码的执行。