深入理解Promise.all_第1页
深入理解Promise.all_第2页
深入理解Promise.all_第3页
深入理解Promise.all_第4页
深入理解Promise.all_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、深入理解promise.aii异步之PromisePromise.allPromise.a接收的romis数组是按顺序执行的还是一起执行的,也就是说返回的结果是顺序固定的吗?目前有两种答案:.应该是同步执行的,但是这样就有效率问题了,如果想改成异步执行怎么办呢?.有些人认为结果是按顺序执行的,有些人认为结果顺序不确定。那么我们根据实现来解密:环境为:vscode1.20.1nodev8.9.0npmv5.6.0实验代码:获取随机数,oiXe四舍五入保留小数,为保留整数,范围oseadomt=t,)t=ah.random,)*1000).toFixedonsttasyncTaskt=t,task

2、newtPromise,t,resolve)t=t随机获取一次0的0随0机数leimeot=tgetRandom,);打印出传递进来的号assar.osole.lotaskID=$taskIDtstart.设置计时时间,等价于seimeof,nction,)打印出执行的as和imeotttconsole.logastaskIDtfinishedtinttime=$timeo异步成功执行ttttresolve,taskID)tt,ttimeo,t);Promise.all,asyncTask,1),asy.then,res,ltListt=tttconsole.log,res,lts:,res实

3、验结果如下:第一次taskID=1ttart.taskID=2ttart.taskID=3ttart.taskID=2tfinishedtinttimetaskID=3tfinishedtinttimetaskID=1tfinishedtinttimeres,lts:Array,3)t第二次taskID=1ttart.taskID=2ttart.taskID=3ttart.taskID=1tfinishedtinttimetaskID=3tfinishedtinttimetaskID=2tfinishedtinttimeres,lts:Array,3)t第三次taskID=1ttart.tas

4、kID=2ttart.taskID=3ttart.taskID=3tfinishedtinttimetaskID=1tfinishedtinttimetaskID=2tfinishedtinttimeresultsArray(补充知识介绍:o方法可把m四舍五入为指定小数位数的数字。NumberObject.toFixed(num)必需m规定小数的位数,是之间的值,包括和,有些实现可以支持更大的数值范围。如果省略了该参数,将用代替。Promise勾造函数只有一个参数,该参数是一个函数,被称作执行器,执行器有个参数,分别是resole和)e,个表示成功的回调,一个表示失败的回调。ePromisei

5、oresolereeseimeoresoleeosole.lo记住,Promise实例只能通过resol或者ree函数来返回,并且使用e或者a获取,不能在ePronfflS直接re,r这样是获取不至到Promise返回值的。由此可见,Promise-allft的任务列表asasasas我们是按照顺序发起的。但是根据结果来说,它们是异步的,互相之间并不阻塞,每个任务完成时机是不确定的,尽管如此,所有任务结束之后,它们的结果仍然是按顺序地映射至Tesl里i这样就能和Promise.alf的任务列表asasasas对应起来。as深入理解Promise.all可能看到这里有些人没有清楚,为什么返回一个

6、数组?我们在来看一下这段代码:Promise.all(asyncTask(1),asyncTask(2),asyncTask(3).then(resultList=console.log(results:,resultList););通常我们在使用异步的时候都是只有一个Promise,现在我们使用all()方法包装多个Promise实例。语法很简单:参数只有一个,可迭代对象,可以是数组,或者Symbol类型等。Promise.all(iterable).then().catch()传入3个Promise实例:Promise.all(newPromise(function(resolve,rej

7、ect)resolve(1),newPromise(function(resolve,reject)resolve(2),newPromise(function(resolve,reject)resolve(3).then(arr=console.log(arr)/1,2,3)那么我们回头想想应该明白了吧?因为我们传入的是数组,那么返回的必须是数组,并且会将讲过进行映射。Promise.race()语法和all()样,但是返回值有所不同,race根据传入的多个Promise实例,只要有一个实例resolve或者reject,就只返回该结果,其他实例不再执行。我们简单看一下例子,返回结果为3,因

8、为我们设置了定时器,第三个Promise执行的最快。Promise.race(newPromise(function(resolve,reject)setTimeout()=resolve(1),1000),newPromise(function(resolve,reject)setTimeout()=resolve(2),100),newPromise(function(resolve,reject)setTimeout()=resolve(3),10).then(value=console.log(value)/3)异步为什么使用箭头函数这是我一直困惑的原因,我们将前面的例子进行改造一下。

9、如下:constgetRandom=()=+(Math.random()*1000).toFixed(0);functiontest(taskID)newPromise(resolve)=/随机获取一次01000的随机数lettimeout=getRandom();/打印出传递进来的D号console.log(tasklD=$tasklDstart.);setTimeout(function()console.log(tasklD=$tasklDfinishedintime=$timeout.);resolve(tasklD),timeout);)Promise.all(test(1),tes

10、t(2),test(3).then(resultList=console.log(results:,resultList););我们先来看一下结果是怎样的?第一次:tasklD=1start.tasklD=2start.tasklD=3start.results:Array(3)undefined,undefined,undefinedtasklD=1finishedintime=460.tasklD=2finishedintime=704.tasklD=3finishedintime=883.第二次:tasklD=1start.tasklD=2start.tasklD=3start.resu

11、lts:Array(3)undefined,undefined,undefinedtasklD=2finishedintime=17.tasklD=3finishedintime=212.tasklD=1finishedintime=612.第三次:tasklD=1start.tasklD=2start.tasklD=3start.results:Array(3)undefined,undefined,undefinedtasklD=3finishedintime=130.tasklD=1finishedintime=256.taskID=2finishedintime=593.实验还是要至少

12、做上3次以上才有说服力。通过输出结果我们能够看出返回的数组内的数据都为undefined。我们就要找出这个原因,那就是找到了为什么要使用箭头函数。首先我通过调试来查找如图:程序首先打印出了taskID=1start.taskID=2start.taskID=3start.说明一定是先执行了松F卜盹4、fflgik*.;-;A:.K-JEWnLMiirlftl.-1-隔T-A皿宅;JM.I1融桜啊他伽闿初時押-dllMVi汕歯*:1MM514-1.iE苗pw声如片jrawagiHVW卜M.1EH问制厂切I円沖小卫:uiideIqlIvsw1i:;,鹹囲;ll/i申:T*l!l-ri:U-Z7;*

13、jrtf丸nx.In护:3間常*i.rrtiiri-H-Flan.ur*jororflonkjziaaltenfci.nai冶ptertct:RU逊e曲tersknjs问雹肚返雎诒縱觀和C鶴曲0珊恒睢無瞅孤:console.log(tasklD=$tasklDstart.);所以我们在这段打上断点进行一步一步调试,如下:functiortest(tcsklD)newPromisef(resolve)=Ijlettimeout=getRandomf);|il打印牲遊刪ID号console4ogtaskID=$ta5kIDstart/);setTimeout(function)consoleJog

14、;taskID=$taskIDfinishedintinie=$tiiKOLit/);resolve(tasklD)3timeout;Pronise.a11(test(1J,test(2),test;3),then(resultList巧ccisoleJogfresults:,resultList););QUpdatedVsrsbnjsQletTest.jsbtiapter.2bciapter3arTcwFurclioii.jsBeifcepcon.j;BexerasajsBletTestjsSSeccndLpdaTezVersiorjs园待我返回完完!这馭出现了异常,:会左一p2=Promise.resolve(2),p3=Promise.resolve(3);Promise.all(p1,p2,p3).then(function(results)console.log(results);/1,2,3);在上面的方法中,promise数组中所有的promise实例都变为resolve的时候,该方法才会返回,并将所有结果传Results数组中。promise数组中任何一个promise为reject的话,则整个Promise.all调用会立即终止,并返回一个reject的新的promise对象。rejec使用示例如下:va

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论