JavaScript承诺和异步等待之间的区别是什么?

JavaScript承诺和异步等待之间的区别是什么?,javascript,asynchronous,promise,async-await,Javascript,Asynchronous,Promise,Async Await,我已经在我的应用程序中使用了和ECMAScript 7功能(感谢Babel),包括移动和web 显然,第一步是实现ECMAScript 6级别。我学习了许多异步模式,承诺(确实很有希望),生成器(不确定为什么使用*符号),等等。 其中,承诺非常符合我的目的。我已经在我的应用程序中大量使用了它们 下面是我如何实现基本承诺的示例/伪代码- var myPromise = new Promise( function (resolve,reject) { var x = MyData

我已经在我的应用程序中使用了和ECMAScript 7功能(感谢Babel),包括移动和web

显然,第一步是实现ECMAScript 6级别。我学习了许多异步模式,承诺(确实很有希望),生成器(不确定为什么使用*符号),等等。 其中,承诺非常符合我的目的。我已经在我的应用程序中大量使用了它们

下面是我如何实现基本承诺的示例/伪代码-

var myPromise = new Promise(
    function (resolve,reject) {
      var x = MyDataStore(myObj);
      resolve(x);
    });

myPromise.then(
  function (x) {
    init(x);
});
随着时间的推移,我遇到了ECMAScript 7特性,其中一个是
ASYNC
AWAIT
关键字/函数。这些结合在一起创造了巨大的奇迹。我已经开始用
async&await
取代我的一些承诺。它们似乎为编程风格增加了巨大的价值

同样,这里有一个伪代码,描述了我的异步等待函数的样子-

async function myAsyncFunction (myObj) {
    var x = new MyDataStore(myObj);
    return await x.init();
}
var returnVal = await myAsyncFunction(obj);
把语法错误(如果有的话)放在一边,我觉得它们做的事情完全一样。我几乎可以用async、Waities取代我的大部分承诺

当承诺做类似的工作时,为什么需要异步、等待

async等待解决更大的问题吗?或者这只是一个不同的解决方案

正如我前面所说,我能够使用Promissions和async,等待解决同样的问题。有什么具体的问题需要异步解决吗

补充说明:

我一直在React项目和Node.js模块中广泛使用async、Waiting和Promission。
React是一个早期开发人员,采用了许多ECMAScript 6和ECMAScript 7功能。

Async/Await在更复杂的场景中提供了更好的语法。特别是,处理循环或某些其他构造(如
try
/
catch
)的任何内容

例如:

while (!value) {
  const intermediate = await operation1();
  value = await operation2(intermediate);
}
仅仅使用承诺,这个例子就要复杂得多

为什么异步,等待承诺做类似工作时需要?async等待解决更大的问题吗

async/await
只是让您对异步代码有一种同步的感觉。这是一种非常优雅的语法糖

对于简单的查询和数据操作,承诺可能很简单,但是如果遇到复杂的数据操作之类的情况,如果代码看起来只是同步的(换句话说,语法本身就是一种“偶然的复杂性”,那么更容易理解发生了什么)
async/await
可以绕过)


如果您有兴趣了解,您可以使用类似的库(与生成器一起)来提供相同的感觉。像这样的东西是为了解决
async/await
最终(本机)解决的问题而开发的。

async/await可以帮助您在需要复杂控制流的情况下使代码更干净、更可读。它还生成更易于调试的代码。而且,只需使用
try/catch
即可处理同步和异步错误


我最近写了这篇文章,通过代码示例展示了async/await在一些常见用例中优于Promission的优点:

充分比较了优缺点

普通JavaScript

  • 专业人士
  • 不需要任何额外的库或技术
  • 提供最佳性能
  • 提供与第三方库的最佳兼容性
  • 允许创建特别的和更高级的算法
  • 缺点
  • 可能需要额外的代码和相对复杂的算法
异步(库)

  • 专业人士
  • 简化了最常见的控制流模式
  • 仍然是基于回调的解决方案
  • 好成绩
  • 缺点
  • 引入外部依赖项
  • 对于高级流来说可能仍然不够
承诺

  • 专业人士
  • 大大简化了最常见的控制流模式
  • 健壮的错误处理
  • ES2015规范的一部分
  • 保证OnCompleted和onRejected的延迟调用
  • 缺点
  • 需要promisify基于回调的API
  • 介绍了一个小的性能打击
发电机

  • 专业人士
  • 使非阻塞API看起来像阻塞API
  • 简化错误处理
  • ES2015规范的一部分
  • 缺点
  • 需要一个补充的控制流库
  • 仍然需要回调或承诺实施非顺序流程
  • 需要thunkify或promisify基于非生成器的API
异步等待

  • 专业人士
  • 使非阻塞API看起来像阻塞API
  • 简洁直观的语法
  • 缺点
  • 今天需要使用巴别塔或其他输送机和一些配置
为什么是异步的,当承诺需要时需要等待 类似的工作?async等待解决更大的问题吗?还是仅仅是一场战争 回叫地狱的不同解决方案?正如我刚才所说,我能够 使用Promissions和Async,等待解决相同的问题。有 异步等待解决的任何特定问题

首先要了解的是,
async
/
await
语法只是一种语法糖分,用于增强承诺。实际上,
async
函数的返回值是一个承诺<代码>异步/
等待
语法为我们提供了以同步方式编写异步的可能性。以下是一个例子:

承诺链接:

function logFetch(url) {
  return fetch(url)
    .then(response => response.text())
    .then(text => {
      console.log(text);
    }).catch(err => {
      console.error('fetch failed', err);
    });
}
async function logFetch(url) {
  try {
    const response = await fetch(url);
    console.log(await response.text());
  }
  catch (err) {
    console.log('fetch failed', err);
  }
}
作为