小编给大家分享一下js中异步与承诺的关系是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
2018年已经到了5月份,节点的4. x版本也已经停止了维护我司的某个服务也已经切到了8. x,目前正在做koa2。x的迁移将之前的发电机全部替换为异步但是,在替换的过程中,发现一些滥用异步导致的时间上的浪费所以来谈一下,如何优化异步代码,更充分的利用异步事件流杜绝滥用异步
<强>首先,你需要了解承诺强>
承诺是使用异步/等待的基础,所以你一定要先了解承诺是做什么的
承诺是帮助解决回调地狱的一个好东西,能够让异步流程变得更清晰。
,一个简单的Error-first-callback转换为承诺的例子:
const fs =,需要(& # 39;fs # 39;) function readFile (文件名),{ ,return new 承诺((解决,,拒绝),=祝辞,{ fs.readFile才能(文件名,(呃,,数据),=祝辞,{ ,,if (err),拒绝(err) ,才能解决(数据) })才能 ,}) } readFile (& # 39; test.log& # 39;),然后(data =祝辞,{ ,console.log (& # 39; get 数据# 39;) },err =祝辞,{ ,console.error (err) })
我们调用函数返回一个承诺的实例,在实例化的过程中进行文件的读取,当文件读取的回调触发式,进行承诺状态的变更,解决或者拒绝状态的变更我们使用然后来监听,第一个回调为解决的处理,第二个回调为拒绝的处理。
<强>异步与承诺的关系强>
异步函数相当于一个简写的返回承诺实例的函数,效果如下:
function getNumber (), { ,return new 承诺((解决,,拒绝),=祝辞,{ 解决(1)才能 ,}) }//,=比; async function  getNumber (), { return 1 }
两者在使用上方式上完全一样,都可以在调用getNumber函数后使用然后进行监听返回值。以及与异步对应的等待语法的使用方式:
getNumber(),然后(data =祝辞,{ ,//got 数据 })//,=比; let data =, await getNumber ()
等待的执行会获取表达式后边的承诺执行结果,相当于我们调用然后获取回调结果一样。另外在异步/等待支持度还不是很高的时候,大家都会选择使用生成器/收益率结合着一些类似于公司的库来实现类似的效果
异步函数代码执行是同步的,结果返回是异步的
异步函数总是会返回一个承诺的实例这点儿很重要所以说调用一个异步函数时,可以理解为里边的代码都是处于新承诺中,所以是同步执行的而最后返回的操作,则相当于在承诺中调用解决:
async function getNumber (), { ,console.log (& # 39; call  getNumber () & # 39;) return 1 } getNumber () (_ =祝辞,console.log(& # 39;解决# 39;)) console.log(& # 39;完成# 39;)//,输出顺序://,call getNumber ()//完成//,解决了
<强>承诺内部的承诺会被消化强>
也就是说,如果我们有如下的代码:
function getNumber (), { ,return new 承诺(resolve =祝辞,{ 解决才能(Promise.resolve (1)) ,}) } getNumber () (data =祝辞,console.log(数据),//,1
如果按照上边说的话,我们在那里边获取到的数据应该是传入解决中的值,也就是另一个承诺的实例。
,但实际上,我们会直接获得返回值:1,也就是说,如果在承诺中返回一个承诺,实际上程序会帮我们执行这个承诺,并在内部的承诺状态改变时触发然后之类的回调。
,一个有意思的事情:
function getNumber (), { ,return new 承诺(resolve =祝辞,{ 解决才能(Promise.reject (new 错误(& # 39;测试# 39;))) ,}) } getNumber () .catch (err =祝辞,console.error (err)),//,错误:,测试
如果我们在解决中传入了一个拒绝,则我们在外部则可以直接使用抓监听到。
这种方式经常用于在异步函数中抛出异常如何在异步函数中抛出异常:
async function getNumber (), { ,return Promise.reject (new 错误(& # 39;测试# 39;)) } try { ,let number =, await getNumber () },catch (e), { ,console.error (e) }js中异步与承诺的关系是什么