JavaScript承诺和异步等待之间的区别是什么?
我已经在我的应用程序中使用了和ECMAScript 7功能(感谢Babel),包括移动和web 显然,第一步是实现ECMAScript 6级别。我学习了许多异步模式,承诺(确实很有希望),生成器(不确定为什么使用*符号),等等。 其中,承诺非常符合我的目的。我已经在我的应用程序中大量使用了它们 下面是我如何实现基本承诺的示例/伪代码-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
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
/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);
}
}
作为