-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
JavaScript 中异步的初步了解 #12
Labels
Comments
https://villainhr.com/page/2016/08/25/async的generator实现 http://scriptoj.mangojuice.top/problems/72?problemsGroupId=593c151a8bf3445a88fa79be juejin.im/post/5b04c7db6fb9a07aa542a772 juejin.im/post/5ca99e8c6fb9a05e786c9e19 segmentfault.com/a/1190000006720137 sinaad.github.io/xfe/2016/07/12/going-async-with-es6-generators |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
JavaScript中有很多异步编程方式:
callback
当一个函数传入“另外一个函数”作为参数时, 我们就可以把这个函数叫做
Callback
函数。 而这里的“另外一个函数”也有一个常见的名字: 高阶函数(Hight order function)。Callback 并非都是异步执行的。 比如, 在我们常用的
Array.prototype.map()
中,其第一个参数也是一个回调函数,但它是同步执行的。Callback 存在着以下2个问题而饱受诟病:
Promise
所谓Promise,简单来说就是一个容器,里面保存着某个未来才会结束的事情(通常是一个异步操作)。从语法上说,Promise是一个对象,从他可以获取异步操作的消息。
Promise
对象代表一个异步操作,有三种状态:pending
(进行中)、fulfilled
(已成功)和rejected
(已失败)。promise对象生成以后,可以用then方法分别指定Resolved状态和Reject状态的回调函数。then方法可以接受两个回调函数作为参数。第一个回调函数是promise对象的状态变为Resolved时调用,第二个回调函数是promise对象的状态变为Reject时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受promise对象传出的值作为参数。
使用
Promise
构造函数时,必须调用resolve()
或reject()
回调。当链接
.then
和.catch
时,将它们视为一系列步骤会很有帮助。每个.then
都接收前一个.then
返回的值作为其参数。但是,如果“step”
遇到错误,则任何后续的.then
“ steps”
都将被跳过,直到遇到.catch
。如果要覆盖错误,要做的就是返回一个非错误值。可以通过任何随后的.then
访问。Promise 也有一些缺陷被人诟病,主要体现在以下两个方面:
async/await
async/await
其实是Promise
的语法糖,它能实现的效果都能用then
链来实现,它是为优化then
链而开发出来的。async
声明function
是异步的,await
等待某个操作完成。语法上强制规定await
只能出现在asnyc
函数中。async 函数返回的是一个 Promise 对象。
await 等待的是一个表达式,这个表达式的计算结果是 Promise 对象或者其它值(换句话说,就是没有特殊限定)。
async 函数的一些缺陷如下:
我们应当明确,async 函数并非一种让 generator 更便于使用的语法糖。async 函数只有在结束时,才会返回的是一个 Promise。我们无法控制其中间状态,而 generator 返回的是迭代器,迭代器让你有充分的控制权。
参考资料
The text was updated successfully, but these errors were encountered: