Skip to content
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

第 12 题:JS 异步解决方案的发展历程以及优缺点 #11

Open
Hanpoung opened this issue May 11, 2019 · 0 comments
Open

第 12 题:JS 异步解决方案的发展历程以及优缺点 #11

Hanpoung opened this issue May 11, 2019 · 0 comments

Comments

@Hanpoung
Copy link
Owner

这道题自己没有什么研究,把知道的先说一下,然后我会结合有些网上的答案进行总结:

  • ajax的success,大名鼎鼎的callback
  • Promise
  • Generator
  • async/await

这里只讲缺点,因为我个人觉得优点都是为了解决异步编程而进行的演变

  • 回调函数:缺点很明显,当业务复杂之后很容易陷入回调地狱
  • Promise:在对调的基础上进行的升级改造,但依旧难以避免回调地狱
  • Generator:这个基本可以解决回调地狱的问题,但是用法略显复杂
  • async/await:目前我觉得的异步终极解决方案,简单强大实用,目前没发现什么缺点

接下来我们来看看其他的答案,答案参考至sisterAn,顺序和我的一样的,但是解释优缺点更详细(果然我只是个切图仔😭),这里就只讲缺点啦,更多详情可以自己去看哟~

缺点:

  • 回调函数:回调地狱,不能用 try catch 捕获错误,不能 return
  • Promise:无法取消 Promise ,错误需要通过回调函数来捕获
  • Generator:缺点是需要手动调用next方法才会遍历下一个内部状态
  • Async/await:await 将异步代码改造成同步代码,如果多个异步操作没有依赖性而使用 await 会导致性能上的降低

调用 Generator 函数,返回一个遍历器对象,代表 Generator 函数的内部指针。以后,每次调用遍历器对象的next方法,就会返回一个有着value和done两个属性的对象。value属性表示当前的内部状态的值,是yield表达式后面那个表达式的值;done属性是一个布尔值,表示是否遍历结束。

  由于 Generator 函数返回的遍历器对象,只有调用next方法才会遍历下一个内部状态,所以其实提供了一种可以暂停执行的函数。yield表达式就是暂停标志。
遍历器对象的next方法的运行逻辑如下。
(1)遇到yield表达式,就暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回的对象的value属性值。
(2)下一次调用next方法时,再继续往下执行,直到遇到下一个yield表达式。
(3)如果没有再遇到新的yield表达式,就一直运行到函数结束,直到return语句为止,并将return语句后面的表达式的值,作为返回的对象的value属性值。
(4)如果该函数没有return语句,则返回的对象的value属性值为undefined。
  需要注意的是,yield表达式后面的表达式,只有当调用next方法、内部指针指向该语句时才会执行,因此等于为 JavaScript 提供了手动的“惰性求值”(Lazy Evaluation)的语法功能。

ps:上述所有观点没有对错,只是学术讨论研究,目的是加深自己对异步编程的了解

完结散花~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant