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)

相关推荐

  • 百万级MySQL的数据量怎么快速完成数据迁移

    技术百万级MySQL的数据量怎么快速完成数据迁移这篇文章主要讲解了“百万级MySQL的数据量怎么快速完成数据迁移”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“百万级MyS

    攻略 2021年11月18日
  • 什么是91视频

    技术什么是91视频本篇内容主要讲解“什么是91视频”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是91视频”吧! 91视频是一款视频播放软件,

    攻略 2021年10月25日
  • 电话查公司,查企业联系方式有哪些方法

    技术电话查公司,查企业联系方式有哪些方法您好,我来为您解答电话查公司。就目前来说,查询企业联系方式,有以下几种办法:1、打114电话查询。
    114可以帮您查询您所需要的企业的联系方式,你只需要把自己想要查询的企业的名称报

    生活 2021年10月26日
  • eclipse中的默认编码方式是什么(eclipse编码格式在哪里)

    技术eclipse编码方法是什么本篇内容介绍了“eclipse编码方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成

    攻略 2021年12月23日
  • 如何解析PHP及配置文件

    技术如何解析PHP及配置文件这篇文章将为大家详细讲解有关如何解析PHP及配置文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。PHP是什么PHP是Hypertext
    Pr

    攻略 2021年11月23日
  • Linux和Unix磁盘管理命令对比的示例分析

    技术Linux和Unix磁盘管理命令对比的示例分析小编给大家分享一下Linux和Unix磁盘管理命令对比的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Unix的LVM是当前使用过的最好用的文件

    攻略 2021年11月18日