如何理解使用传统 Promises 的 JavaScript 异步函数?

问题描述 投票:0回答:1

我想我对 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
,我有时会忽略这些,因为我的许多同事不进行错误处理,只是假设它是网络故障和代码对此无能为力。

javascript asynchronous es6-promise
1个回答
0
投票

翻译几乎完成,但缺少

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 对象。

引擎盖下:

  1. await
    仅返回承诺操作数的成功结算值 - 或非承诺操作数的实际值。如果需要特定的错误处理,您可以在
    try/catch
    语句周围使用
    await promise
    结构,或者开始在
    catch
    函数中使用带有
    async
    子句的承诺链(这看起来有点奇怪)。
  2. finally
    子句需要明确链接到
    async
    正文中的 promise 值,或者取决于可能添加到从异步函数返回的 promise 的具体情况。
  3. 调用异步函数同步执行直到
  • 执行返回语句。函数调用者(同步)返回相当于
    Promise.resolve(returnValue)
  • 抛出错误。除非被
    try/catch
    捕获,否则函数调用者(同步)返回相当于
    Promise.reject( thrownValue)
    .
  • an
    await
    运算符被执行。函数调用者同步返回一个挂起的承诺。
    await
    在复制其调用上下文并返回事件循环等待等待承诺的解决之前,篡改调用堆栈以恢复调用代码的执行。
© www.soinside.com 2019 - 2024. All rights reserved.