javascript - ES7 异步函数和 promise 之间的技术区别?

标签 javascript babeljs ecmascript-next

我试图更好地理解 JavaScript 中的 async function 在技术上是什么,即使我基本上知道如何使用它们也是如此。

许多对 async/await 的介绍让人相信 async 函数基本上只是一个 promise ,但显然不是这样(至少在 Babel6-transpiled code 中不是):

async function asyncFunc() {
  // nop
}

var fooPromise = new Promise(r => setTimeout(r, 1));

console.clear();

console.log("typeof asyncFunc is", typeof asyncFunc); // function
console.log("typeof asyncFunc.next is", typeof asyncFunc.next); // undefined
console.log("typeof asyncFunc.then is", typeof asyncFunc.then); // undefined

console.log("typeof fooPromise is", typeof fooPromise); // object
console.log("typeof fooPromise.next is", typeof fooPromise.next); // undefined
console.log("typeof fooPromise.then is", typeof fooPromise.then); // function

不过,await promise 绝对是可能的,比如 await fooPromise()

  • async funtion 是它自己的东西吗?await 只是兼容 promises 吗?

    <
  • 还有,有没有办法在运行时区分简单的函数异步函数(以 Babel 兼容的方式)?

最佳答案

异步函数是一个返回 promise 的函数。它可以帮助您解决一系列异步操作接连发生的情况:

function asyncFunc() {
  return doSomethingAsync() // doSomethingAsync() returns a promise
    .then(() => {
      // do some stuff
      return doSomethingElseAsync(); // returns a promise
    })
    .then(something => {
      // do some stuff
      return doSomethingElseEntirelyAsync(something); // returns a promise
    });
}

转向

async function asyncFunc() {
  await doSomethingAsync(); // awaits for a promise
  // do some stuff
  let something = await doSomethingElseAsync(); // awaits for a promise
  // do some stuff
  return doSomethingElseEntirelyAsync(something); // returns the final promise
  // Note that even if you return a value, like return 5, the function as a whole
  // still returns a promise!
}

它读起来好多了,你可以使用像 try/catch 和 for 循环这样的普通工具来处理它们,即使它们是异步的。

异步函数不是 promises 的替代品,它们是 promises 之上的糖分,用于处理具有许多顺序异步操作的特定情况。

因为 await 基本上只是“等待这个 promise ”,你仍然可以使用很酷的聚合方法,比如 Promise.all()Promise.race () 并等待多个(或多个)promise 的结果。

我不熟悉在运行时区分两者的方法,因为与类一样,异步函数只是 Promises 之上的糖分。 (尽管可能存在使用函数的 .toString 并解析结果等黑客攻击,但我不计算这些)。

关于javascript - ES7 异步函数和 promise 之间的技术区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34739883/

相关文章:

javascript - 在 Array.reduce 中使用扩展符号

javascript - Babili 缩小但不转译

reactjs - 将整个状态从 redux 传递给组件有什么缺点吗?

javascript - React setState 中的竞争条件

javascript - 更改/追加文本区域中的值

javascript - iOS safari 上带有模板字符串文字的语法错误

javascript - ECMAScript 6 在对象解构中扩展了语法。支持 TypeScript 和 Babel

javascript - 在类 get 和 set 方法上使用 ES 装饰器

javascript - 正则表达式匹配除两个保留字符串之外的任何字符串?

javascript - 我的 React CSSTransition 动画不起作用