当前位置:  开发笔记 > 编程语言 > 正文

ES7异步功能和承诺之间的技术差异?

如何解决《ES7异步功能和承诺之间的技术差异?》经验,为你挑选了1个好方法。

我试图更好地理解async functionJavaScript在技术上是什么,即使我基本上知道如何使用它们.

对async/await的许多介绍都相信async函数基本上只是一个承诺,但事实上并非如此(至少不是Babel6-transiled代码):

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一种承诺await fooPromise().

它是一个async funtion属于自己的东西,await只是与承诺兼容

并且,有没有办法区分简单functionasync function运行时(以Babel兼容的方式)?

Madara Uchih.. 10

异步函数是一个返回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的替代品,它们在它们之上是糖,用于处理具有许多顺序异步操作的特定情况.

因为await基本上只是"等待这个承诺",你仍然可以使用类似Promise.all()和的酷聚合方法,Promise.race()并等待几个(或几个)承诺的结果.

我不熟悉在运行时区分这两者的方法,因为像类一样,异步函数只是Promise之上的糖.(虽然可能有像使用函数.toString和解析结果的黑客,但我不计算那些).



1> Madara Uchih..:

异步函数是一个返回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的替代品,它们在它们之上是糖,用于处理具有许多顺序异步操作的特定情况.

因为await基本上只是"等待这个承诺",你仍然可以使用类似Promise.all()和的酷聚合方法,Promise.race()并等待几个(或几个)承诺的结果.

我不熟悉在运行时区分这两者的方法,因为像类一样,异步函数只是Promise之上的糖.(虽然可能有像使用函数.toString和解析结果的黑客,但我不计算那些).

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有