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)

相关推荐

  • 属兔与什么属相最配,属兔的男人和什么属相最配

    技术属兔与什么属相最配,属兔的男人和什么属相最配属兔婚配表属兔与什么属相最配: 宜配:羊、狗、猪,功业成就,安居乐业,专利兴家。
    忌配:龙、鼠、鸡,家庭难有幸福,逆境之象,事业不成,灾祸之致,历尽痛苦。 解释:
    卯兔

    生活 2021年10月31日
  • 如何实现web微前端沙箱

    技术如何实现web微前端沙箱这篇文章主要讲解了“如何实现web微前端沙箱”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现web微前端沙箱”吧!背景应用沙箱可能是微前

    攻略 2021年11月15日
  • 街道用英语怎么说,街道上有很多商店,用英语怎么说

    技术街道用英语怎么说,街道上有很多商店,用英语怎么说There are many stores on the street.There are some stores on the street.
    There are a

    生活 2021年10月22日
  • Python与C++引用的示例分析

    技术Python与C++引用的示例分析本篇文章给大家分享的是有关Python与C++引用的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在用Pyth

    攻略 2021年10月25日
  • 怎么运行docker容器

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

    攻略 2021年12月13日
  • 如何进行Java反编译插件的安装和使用

    技术如何进行Java反编译插件的安装和使用今天就跟大家聊聊有关如何进行Java反编译插件的安装和使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在开发过程中,如

    攻略 2021年11月10日