Promise和Generato中如何用同步方法写异步JavaScript

技术Promise和Generato中如何用同步方法写异步JavaScript这篇文章给大家介绍Promise和Generato中如何用同步方法写异步JavaScript,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望

本文介绍了如何在Promise和Generato中用同步方法编写异步JavaScript。内容非常详细,有兴趣的朋友可以参考一下,希望对你有帮助。

最近在写自己的网站时(大家可以看看~Colors),不知不觉写了一段可怕的代码,里面嵌套了五个带回调的回调函数。当我回过神来的时候,我被自己震惊了。我做不到。太难看了!所以我计划尝试一些流行的异步解决方案。经历了许多麻烦之后.我终于找到了一个满意的解决办法(放不下)。

1. JavaScript异步解决方案有哪一些

事实上,异步JavaScript已经不再是一个高级的东西了。Nodejs的出现,尤其是回调地狱的可怕写法,成功地逼出了许多伟大的解决方案。在这里,请阅读大神尤雨溪的这篇短文,它简要介绍了常用的async.js、promise、co、async/await。个人建议有机会可以试一试。从个人角度来看,我可能会根据以下标准(个人喜好)进行选择:

如果我需要编写一个爬虫来控制并发性,我将使用async.js。有一些API非常方便。

在编写前端代码时,你可能会倾向于考虑Promise,因为一般来说,除了ajax之外,前端异步场景并不多。我以前用过同构取数,感觉很棒。

后端代码nodejs,那么一定是CO,按照大神尤雨溪的说法,es7的异步/等待只是Promise Generator的语法糖。co是一个神一样的图书馆,结合了诺言和发电机。本文主要讨论Promise和Generator相结合的异步解决方案。

2. Promise Generator简单入门

ES6是个好东西,其中Promise和Generator可以说是最好的部分之一。这里简单介绍一下《无极》和《发电机》。这一部分的介绍将非常简单,它只是这两个新特性的一部分,但是本文中提到的所有要点都是需要的。当然,从学习的角度来说,应该找书充分了解这两个特点,至少有个印象~个人可以通过阅读NCZ的《理解ECMAScript6》或者阮一峰的《ES6标准导论》来学习ES6,都有电子书,太棒了!前者语言通俗易懂,生动有趣,后者会更细致有条理。如果你已经对这些功能了如指掌,就不需要看这一节了~

2.1 Promise

Promise的版本很多,实现的库也很多,但这里主要介绍ES6标准的内容。如果对以下特点不了解,请先看看以上两本书的对应章节。

至于承诺,首先要意识到它是一个对象。这种对象可以由Promise构造函数创建,也可以通过Nodejs本身的一些默认返回来获得。

承诺对象有三种状态:待定、已履行和已拒绝。对应于未开始状态、成功状态和失败状态。

这种对象通常封装异步方法。在异步方法中,解析和拒绝用于定义何时成功,何时错误,参数同时传递给这两个函数。这些参数是异步结果或错误。

异步有成功也有错误。对象的then和catch方法指定异步结束后的操作(正确的处理函数/错误处理函数)。然后和catch是Promise.prototype上的函数,所以它们可以在“实例化”之后直接使用(实际上不是真正的实例)。

这个承诺对象的另一个神奇之处是它可以级联。然后每个返回一个承诺对象。如上所述,如果存在异步,等待异步,然后选择指定的正确或错误处理函数。

2.2 Generator

生成器函数是一个带星号的函数,可以暂停。

在函数内部,函数由yield推动。通过定义收益率后的值来确定返回值。

该函数返回一个测力计,该测力计有一个下一个方法,并且可以获得一个对象,该对象包含由yield定义的参数。

我们先不谈ES6知识的其他特性。写同步(yi)代码,掌握以上就足够了。

3. Co

咚咚咚咚。魔术队在舞台上!这是上帝写的图书馆。使用方法很简单,Github上的README也很清晰。主要有两点:

Co函数中包裹了一个生成器函数,可以在生成器函数中使用yield promise对象来达到异步的目的。在Co的内部实现中,递归调用下一个函数,返回每个诺言的值,从而实现从异步到同步的写入。

Co函数返回一个promise对象,然后可以调用catch方法来传递Generator函数返回的结果。方便后续成功。

理或者错误处理。

4. 如何用同步的写法写异步的代码

下面展示一段异步处理的代码,可以看到,同步的写法写异步真的很爽...

function *foo(res, name, newPassword, oldPassword) {   try {     // yield一个promise对象,如果有错误就会被后面的catch捕捉到,成功就会返回user。     const user = yield new Promise(function(resolve, reject) {       // 常见的数据库读取星系       User.get(name, function(err, user) {         if(err) reject(err)         resolve(user)       })     })      if(user.password != oldPassword) {       return res.send({errorMsg:"密码输入错误!"})     }      // 看到这一个异步函数和上一个的异步在写法上是基本上“同步”的,没有了相互嵌套,很优雅~也更加方便了debug~     yield new Promise(function(resolve, reject) {       User.update(name, newPassword, function(err) {         if(err) reject(err)         res.send({msg: "你成功更换密码了!"})         resolve()       })     })    } catch(e) {     console.log("Error:", e)     return res.send({errorMsg:"Setting Fail!"})   } }  // 使用的话就直接调用co包含对应的Generator函数即可。 co(foo(res, name, newPassword, oldPassword))

关于Promise和Generato中如何用同步方法写异步JavaScript就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/97012.html

(0)

相关推荐

  • SpringBoot中JPA如何实现Sort排序

    技术SpringBoot中JPA如何实现Sort排序这篇文章将为大家详细讲解有关SpringBoot中JPA如何实现Sort排序,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。环境说明S

    攻略 2021年11月21日
  • 如何把word压缩小一点

    技术如何把word压缩小一点这篇文章给大家分享的是有关如何把word压缩小一点的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  使用工具:迅捷压缩  工具介绍:  迅捷压缩软件是一款集图片压缩

    攻略 2021年10月26日
  • socket和serversocket区别(说明socket通信有哪些种类)

    技术Socket与ServerSocket类构造方法有哪些这篇文章主要介绍“Socket与ServerSocket类构造方法有哪些”,在日常操作中,相信很多人在Socket与ServerSocket类构造方法有哪些问题上

    攻略 2021年12月16日
  • SQL32 将employees表的所有员工的lastname和firstname拼接起来作为Name

    技术SQL32 将employees表的所有员工的lastname和firstname拼接起来作为Name SQL32 将employees表的所有员工的last_name和first_name拼接起来

    礼包 2021年10月28日
  • 怎么解决MySQL的[ERROR] InnoDB: ./ibdata1 can't be opened in read-write mode问题

    技术怎么解决MySQL的[ERROR] InnoDB: ./ibdata1 cant be opened in read-write mode问题本篇内容主要讲解“怎么解决MySQL的[ERROR] InnoDB: ./

    攻略 2021年11月19日
  • 12组-Alpha冲刺-4/6

    技术12组-Alpha冲刺-4/6 12组-Alpha冲刺-4/6侯钦凯过去两天完成了哪些任务
    完善UI界面,复习考试展示GitHub当日代码/文档签入记录接下来的计划复习考试,准备答辩还剩下哪些任务博

    礼包 2021年11月15日