我们在使用 async/await 语法时,有时会这样用:

function getName () {
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve('tony')
}, 2000)
})
}
function getId () {
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve('123')
}, 3000)
})
} ;(async ()=>{
let name = await getName()
let id = await getId()
alert(`name:${name}, id:${id}`)
})()

一眼看上去,应该是3秒种多一点就会 alert 出 'name:tony, id:123',实际上却花费了5秒才出现提示框,她们是串行执行的!而我们想要的是并行执行,因为她们之间并没有依赖关系。串行执行只会白白增加无谓的等待时间!怎么解决呢?

我们先看 Promise 的语法:

new Promise( function(resolve, reject) {...} /* executor */ );

executor是带有 resolve 和 reject 两个参数的函数 。 Promise构造函数执行时立即 调用executor 函数 , resolve 和 reject 两个函数作为参数传递给executor(executor 函数在Promise构造函数返回新建对象前被调用)。resolve 和 reject 函数被调用时,分别将promise的状态改为fulfilled(完成)或rejected(失败)。executor 内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled,或者在发生错误时将它的状态改为rejected。

传给 Promise 作为参数的函数会在 new 创建实例时立即调用

上面的代码,可以分解成这样:

;(async ()=>{
let namePromise = getName()
let name = await namePromise
let idPromise = getId() // 2000ms之后才生成 Promise 实例
let id = await idPromise
alert(`name:${name}, id:${id}`)
})()

所以,如果想并行执行,我们应该先生成所有需要使用的Promise实例:

;(async ()=>{
let namePromise = getName()
let idPromise = getId() // 先生成所有 promise 实例
let name = await namePromise
let id = await idPromise
alert(`name:${name}, id:${id}`)
})()

或者使用Promise.all

;(async ()=>{
var result = await Promise.all([getName(), getId()])
alert(`name:${result[0]}, id:${result[2]}`)
})()

async/await 里的并行和串行的更多相关文章

  1. Promise的并行和串行

    Promise 并行 这个功能Promise自身已经提供,不是本文的重点.主要是依赖Promise.all和Promise.race. Promise.all是所有的Promise执行完毕后(reje ...

  2. 大叔也说并行和串行`性能提升N倍(N由操作系统位数和cpu核数决定)

    返回目录 并行是.net4.5主打的技术,同时被封装到了System.Threading.Tasks命名空间下,对外提供了静态类Parallel,我们可以直接使用它的静态方法,它可以并行一个委托数组, ...

  3. activiti并行和串行区别

    多实例还有并行.串行区分.以下解释一下什么是并行与串行 并行代表同时进行,如把任务分给5个人来处理,这5个人同时会收到任务,并且可以同时处理,不受各自的影响. 串行代表工作或任务由一个人完成后,再由另 ...

  4. 7.JavaScript-Promise的并行和串行

    Promise 并行 Promise.all是所有的Promise执行完毕后(reject|resolve)返回一个Promise对象. 最近在开发一个项目中,需要等接口拿到全部数据后刷新页面,取消l ...

  5. 动画处理<并行和串行>

    并行动画 当多个动画定义同时指向某个组件,并使用动画控制器启动时,就产生了并行动画(Parallel Animation).例如我们可以让一个组件: 移动的同时改变大小 旋转的同时边界颜色闪烁 圆形图 ...

  6. NodeJs使用async让代码按顺序串行执行

    描述 由于nodejs中的函数调用都是异步执行的,而笔者在工程开发中函数A需要四五个参数,而这四五个参数值都是通过函数调用获得,因此按顺序写代码时,执行到函数A时,往往函数A需要的参数值因为参数的异步 ...

  7. Quarz.net 设置任务并行和任务串行

    如何设置Quarz.net某个任务完成后再继续执行该任务?  Quarz.net 的任务有并行和串行两种: 并行:一个定时任务,当执行时间到了的时候,立刻执行此任务,不管当前这个任务是否在执行中: 串 ...

  8. promise async await使用

    1.Promise (名字含义:promise为承诺,表示其他手段无法改变) Promise 对象代表一个异步操作,其不受外界影响,有三种状态: Pending(进行中.未完成的) Resolved( ...

  9. Javascript中的async await

    async / await是Javascript是ES7的重要特性之一,也是目前社区里公认的优秀异步解决方案.目前,async / await这个特性已经是stage 3的建议,可以看看TC39的进度 ...

随机推荐

  1. github 使用“git commit -m"命令时候出现的一个小问题

    git commit -m 使用问题 今天提交文件到github,步骤是: git add abc.py (abc.py是我当前随意写的一个文件名) git commit -m 'add codes ...

  2. 菜鸟之路——机器学习之决策树个人理解及Python实现

    最近开始学习机器学习,以下会记录我学习中遇到的问题以及我个人的理解 决策树算法,网上很多介绍,在这不复制粘贴.下面解释几个关键词就好. 信息熵(entropy):就是信息不确定性的多少 H(x)=-Σ ...

  3. HDU 4308 Saving Princess claire_(简单BFS)

    求出不使用P点时起点到终点的最短距离,求出起点到所有P点的最短距离,求出终点到所有P点的最短距离. 答案=min( 不使用P点时起点到终点的最短距离, 起点到P的最短距离+终点到P的最短距离 ) #i ...

  4. var,let,const,三种申明变量的整理

    javascript,正在慢慢变成一个工业级语言,势力慢慢渗透ios,安卓,后台 首先let,是局部变量,块级作用域:var全局的,const是常量,也就是只读的: 一行demo说明 for (var ...

  5. HDU2376Average distance(树形dp|树上任意两点距离和的平均值)

    思路: 引:如果暴力枚举两点再求距离是显然会超时的.转换一下思路,我们可以对每条边,求所有可能的路径经过此边的次数:设这条边两端的点数分别为A和B,那 么这条边被经过的次数就是A*B,它对总的距离和的 ...

  6. asp.net 后台注册(调用)JS

    1.使用Page.ClientScript.RegisterClientScriptBlock 使用 Page.ClientScript.RegisterClientScriptBlock可以防止ja ...

  7. 腾讯云 activeMQ Illegal character in hostname at index 7

    查找问题步骤: 1.  /usr/local/apache-activemq-5.9.1/data/activemq.log 看一下这个.log后缀的启动日志,可以将它下载下来再看. 先尝试修改配置文 ...

  8. 基于c++和opencv底层的图像旋转

    图像旋转:本质上是对旋转后的图片中的每个像素计算在原图的位置. 在opencv包里有自带的旋转函数,当你知道倾斜角度theta时: 用getRotationMatrix2D可得2X3的旋转变换矩阵 M ...

  9. stm32的两种固件下载模式:JTAG和SWD

    一.JTAG模式 这种模式一般有10pin的.14pin的和20pin的,尽管引脚数和引脚的排列顺序不同,但是其中有一些引脚是一样的.值得注意的是,不同的IC公司会自己定义自家产品专属的Jtag头,来 ...

  10. linux 服务器丢包故障排查

    项目开了个P2P服务器,但是运行一段时间就会出现丢包问题,具体表现为:1.udp丢包严重(一分钟收发分别1.5W) 2.ssh(用于运维指令)连接不上该服务器(超时) 3.服务器运行好像没什么异常,u ...