介绍
这篇文章给大家分享的是有关什么是承诺的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。
承诺是什么
官网解释承诺表示一个异步操作的最终结果。
翻译,==可以将承诺理解为一个状态机==,它存在三种不同的状态,并在某一时刻只能有一种状态
等待表示还在执行解决执行成功拒绝执行失败
一个承诺是对一个异步操作的封装,异步操作有等待完成,成功和失败三种可能的结果,对应了承诺的三种状态。
承诺的状态只能有等待转换位解决或者等待转换为拒绝,一旦状态转化完成就无法再改变。
假设我们用承诺封了一个异步操作,那么当它被创建的时候就处于等待状态,当异步操作成功完成时,
我们将状态转换为解决,如果执行中出现错误,将状态转换为拒绝。
var=承诺新的承诺(函数(解决,拒绝){//代码 如果(){/*异步操作成功*/解决(值) 其他}{ 拒绝(错误) } })
使用然后方法获取结果
var fs=要求(& # 39;fs # 39;) 函数readFile_promise(路径){ 返回新的承诺(函数(解决,拒绝){ fs。readFile(路径,& # 39;utf - 8 # 39;,函数(呃,数据){ 如果(数据){ 解决(数据) 其他}{ 拒绝(err) } }) }) } 结果var=readFile_promise (& # 39;。/1. txt # 39;) result.then(功能(价值){//成功 console.log(& # 39;成功# 39;,值) (错误){},函数//失败 console.log(& # 39;失败# 39;,错误) })//将一个异步函数封装成承诺,只要在回调函数中针对不同的返回结果调用解决或者拒绝方法。//解析函数会在异步操作成功完成时被调用,并将异步操作的返回值作为参数传递到外部。//拒绝是在异步操作出现异常时被调用,会将错误信息作为参数传递出去。
然后方法的返回值
然后方法总是返回一个新的承诺对象,多次调用然后方法,默认返回一个一个空的承诺对象
使用回报来来返回。
var=readFile_promise承诺(& # 39;。/foo.txt& # 39;) promise.then(功能(价值){//成功 console.log(& # 39;成功# 39;,值)//foo 返回readFile_promise (& # 39;。/bar.txt& # 39;) (错误){},函数//失败 console.log(& # 39;失败# 39;,错误) })(功能(价值){ console.log(& # 39;然后# 39;,值)//酒吧 })<编辑>承诺的执行编辑>
- <李>虽然我们是通过然后方法来获取承诺的结果,但是承诺是当那方法调用之后才执行吗? 李>
var=new承诺承诺((解决,拒绝)=祝辞{ console.log(& # 39;开始# 39;) 解决() }) setTimeout(()=祝辞{ promise.then(()=祝辞{ console.log(& # 39;结束# 39;) }) }, 5000)//开始开始5 s后结束//运行顺序是,当承诺从被创建的那一刻起就开始执行了,然后方法只是提供了访问承诺状态的接口,与承诺的执行无关。<编辑>承诺常用的api 编辑>
- <李> 李> <李>解决拒绝了李> <李> 李> <李>所有种族的方法接收一个承诺数组作为参数并返回一个新的承诺,数组中的承诺会同时开始执行,种族返回的承诺的状态有数组中率先执行完毕的承诺的状态决定李> <李>抓住执行出错可以使用扔关键字抛出错误,并使用抓方法进行捕获李>
//如果有多个承诺需要执行,可以使用promise.all ()//方法统一声明,改方法可以将多个承诺对象包装成一个承诺//该方法接收一个数组作为参数,数据的元素如果不是承诺对象,则回先调用解决方法转换。//如果中间有一个承诺状态是拒绝,那么转换后的承诺也会变成拒绝,并且将错误信息传给抓方法 var承诺=[& # 39;foo.txt& # 39; & # 39; bar.txt& # 39;, & # 39; baz.txt& # 39;】 promises.map(函数(路径){//console.log(路径) 返回readFile_promise(路径) }) Promise.all(承诺),然后(函数(结果){ console.log(结果)//[& # 39;foo.txt& # 39; & # 39; bar.txt& # 39;, & # 39; baz.txt& # 39;]顺序排列的 }).catch(函数(err) {//})<编辑>使用承诺组织异步代码编辑>
//例子,有三个文本文件需要顺序读取 var列表=[& # 39;foo.txt& # 39; & # 39; bar.txt& # 39;, & # 39; baz.txt& # 39;】 var计算=0; readFile_promise (& # 39; foo.txt& # 39;),然后(readCB) (readCB) (readCB); 函数readCB(数据){ 巴兹console.log(数据)//foo酒吧 如果(+ + count> 2) { 返回 } 返回readFile_promise(列表[数]) }什么是承诺