本文介绍了如何在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