promise中的all方法和race方法
这两个方法,都是并行执行多个异步操作。而不同的是,all方式遵循“谁跑得慢,以谁为准执行回调”,而race遵循的是“谁跑的快,以谁为准执行回调”

以下为两个异步函数
function yibu1() {
            var p1 = new Promise((resolve, reject) => {
                setTimeout(() => {
                resolve('第一个异步执行成功')
            },3000)
            })
            return p1
        }

function yibu2() {
            var p2 = new Promise((resolve, reject) => {
                setTimeout(() => {
                resolve('第二个异步执行成功')
            },2000)
            })
            return p2
        }

当使用all实现并行执行时,结果如下
Promise.all([yibu1(), yibu2()]).then(function (res) {
            console.log(res)
        }).catch(function (reason) {
            console.log(reason)
        })

返回的是每个异步函数执行回调后的结果组成的数组
当使用race实现并行执行时,结果如下
Promise.race([yibu1(), yibu2()]).then(function (res) {
            console.log(res)
        }).catch(function (reason) {
            console.log(reason)
        })

谁先执行结束,谁先进入回调加粗样式

Promise.all
Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。

具体代码如下:

let p1 = new Promise((resolve, reject) => {
  resolve('成功了')
})

let p2 = new Promise((resolve, reject) => {
  resolve('success')
})

let p3 = Promse.reject('失败')

Promise.all([p1, p2]).then((result) => {
  console.log(result)               //['成功了', 'success']
}).catch((error) => {
  console.log(error)
})

Promise.all([p1,p3,p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)      // 失败了,打出 '失败'
})

Promse.all在处理多个异步处理时非常有用,比如说一个页面上需要等两个或多个ajax的数据回来以后才正常显示,在此之前只显示loading图标。
代码模拟:

let wake = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`${time / 1000}秒后醒来`)
    }, time)
  })
}

let p1 = wake(3000)
let p2 = wake(2000)

Promise.all([p1, p2]).then((result) => {
  console.log(result)       // [ '3秒后醒来', '2秒后醒来' ]
}).catch((error) => {
  console.log(error)
})

需要特别注意的是,Promise.all获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的,即p1的结果在前,即便p1的结果获取的比p2要晚。这带来了一个绝大的好处:在前端开发请求数据的过程中,偶尔会遇到发送多个请求并根据请求顺序获取和使用数据的场景,使用Promise.all毫无疑问可以解决这个问题。

Promise.race的使用
顾名思义,Promse.race就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。

let p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success')
  },1000)
})

let p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('failed')
  }, 500)
})

Promise.race([p1, p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)  // 打开的是 'failed'
})

all()方法

Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

const p = Promise.all([p1, p2, p3]);
1
上面代码中,Promise.all()方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。另外,Promise.all()方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。

p的状态由p1、p2、p3决定,分成两种情况。

(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。

(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

下面是一个具体的例子。

// 生成一个Promise对象的数组
const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
  return getJSON('/post/' + id + ".json");
});

Promise.all(promises).then(function (posts) {
  // ...
}).catch(function(reason){
  // ...
});

promise中的all和race方法相关推荐

  1. 前端学习(1260):promise中的常见api对象方法

  2. es6 Promise.race()方法

    Promise.race()方法 Promise.race方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例. const p = Promise.race([p1, p2, ...

  3. promise中的.then方法【待完善】

    promise中的.then方法 一.promise then 用法详解 举例说明:代码示例: 二.Promise中then()方法使用,多次调用.链式调用 1.多次调用`then` 2.链式调用`t ...

  4. 【JS】Promise.race()方法例子流程详解

    在理清Promise.all()中每个流程的时候实在是头大,理了半天,做此记录以便回顾 promise部分源码如下,只摘取用到的部分 function Promise(excutor) {const ...

  5. Promise.race()方法

    Promise.race()方法 Promise.race方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例. const p = Promise.race([p1, p2, ...

  6. [JavaScript] promise中.then()方法

    promise中.then()方法 promise的构造函数是同步执行 promise.then中的函数是异步执行 .then()异步执行 : 当此方法执行完后再执行内部的程序是避免了没有获取到数据 ...

  7. promise中的.then()方法

    promise中.then()方法 promise的构造函数是同步执行 promise.then中的函数是异步执行 .then()异步执行 : 当此方法执行完后再执行内部的程序是避免了没有获取到数据 ...

  8. ES6中的Promis的使用方法

    什么是Promise? Promise是由 CommonJS 在 Promises/A 规范中提出来的,是js一部编程的重要概念,是比较就行的javascript一部变成解决方案之一. 常见的异步编程 ...

  9. Promise第一篇:基本使用方法和串联

    目录 1.基本使用 2.Promise的串联 1.基本使用 首先清楚promise的过程:事件从unsettled未解决阶段(pending状态)开始发展到settled已解决阶段(resolved和 ...

最新文章

  1. 使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。...
  2. ubuntu上建立mini2440 qt编译环境
  3. 电商网站数据分析的重要性
  4. NUP2105L CAN BUS总线端口静电保护器件
  5. RPC和REST区别
  6. 共享锁与排它锁区别(转)
  7. 怎么把python添加到path_如何将python的路径加到path中
  8. 用html制作学生个人博客,网页制作论坛(学生个人网页制作代码)
  9. 广州地铁公厕(洗手间)和母婴室信息汇总
  10. 优秀的软件测试简历是什么样的?
  11. java 8 排序_java8——排序
  12. 两球体相交,球缺的计算
  13. 开展网络口碑营销之前必须做好的几件事
  14. 阿里云——弹性公网IP
  15. 985 材料专业研究生年薪 20 多万也不少了吧,为什么还有那么多人劝退,转行能挣多少钱?
  16. OpenCV基础(基于Opencv4.4+VS2019)
  17. php工程师元初,历代社日诗词选(42首)
  18. fatal: No url found for submodule path ‘xxx/xxx‘ in .gitmodules gitsubmodule子仓库无法拉取问题
  19. PHP开发工程师(初级,中级,高级)
  20. 【考研英语-基础-长难句】复合句_状语从句【从属连词】9种【时间_原因_结果_条件_让步--地点_目的_比较_方式状语从句】

热门文章

  1. 图像分割---基于阈值处理的基本方法
  2. 欢太科技支招:怎么避免小孩游戏误充值?
  3. 第一次加班-走在明亮寂寞的解放碑
  4. 用python itchat包 爬取微信好友头像形成矩形头像集
  5. 迁移学习的基本概念、使用场景与方法
  6. 每日踩坑--使用Font Awesome关于cdn、http资源、本地资源
  7. 谈Spring的事务管理
  8. Java网络编程_TCP编程以及UDP编程
  9. sql 优化笔记(不全的,暂时存盘,不建议看,关闭留言,想喷也喷不了)
  10. 下载: eMule 0.46b 2005-07-05