示例

// Promise.resolve()
Promise.resolve(1).then((data) => {
console.log(data) // 1
})
// Promise.reject()
Promise.reject(2).catch((data) => {
console.log(data) // 2
})
// Promise.all()
// 多个Promise都成功后获取结果,调用成功回调,如果有一个promise失败了,all返回的promise对象也会失败,调用失败回调
Promise.all([1, new Promise((res, rej) => { res(10) })]).then((data) => {
console.log(data) // [1, 10]
})
// Promise.finally()不管上一个promise状态是什么 都会执行
Promise.resolve(111).finally((data) => {
console.log(data) // undefined
return 2;
// return new Promise((resolve, reject) => {
// reject('222')
// })
}).then(data => {
console.log(data) // 111
}).catch(reason => {
console.log(reason) // finally中返回失败的promise才执行
}) // race 谁最快改变状态 就执行谁的回调
Promise.race([1,3]).then(data => {
console.log(data) // 1
}).catch(err => console.log(data))

手写实现

class MyPromise {
static finally(callback) {
return this.then(data => {
// 直接调用callback()无法处理异步代码
Promise.resolve(callback()).then(() => data)
}, err => {
Promise.resolve(callback()).then(() => {throw err})
})
}
static all(promises) {
let results = [];
let promiseCount = 0;
let promisesLength = promises.length;
return new Promise(function(resolve, reject) {
for (let val of promises) {
// 将普通值也包装成promise来处理
Promise.resolve(val).then(function(res) {
// 记录当前执行了几个promise
promiseCount++;
// 成功回调的参数存放到结果数组中
results.push(res);
// 当所有promise都为成功转态,在all返回的promise实例中调用resolve,传入结果数组。 if (promiseCount === promisesLength) {
return resolve(results);
}
}, function(err) {
return reject(err);
});
}
});
} static race(proms) {
return new Promise((resolve, reject) => {
proms.forEach((p) => {
p.then(
(data) => {
resolve(data);
},
(err) => {
reject(err);
},
);
});
});
} static resolve(data) {
if (data instanceof Promise) {
return data;
} else {
return new Promise((resolve) => {
resolve(data);
});
}
} static reject(reason) {
return new Promise((resolve, reject) => {
reject(reason);
});
}
}

Promise静态方法实现(all race finally resolve reject)的更多相关文章

  1. [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)

    关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下pro ...

  2. es6中promise ALL Race Resolve Reject finish的实现

    function mypromise(func){ this.statue = "pending"; this.data = null; this.resolveCallback ...

  3. Promise(resolve,reject)的基本使用

    什么是Promise? Promise是一个构造函数,其原型上有 then.catch方法,还有reslove,reject等静态方法.通过创建Promise实例,可以调用Promise.protot ...

  4. ES6的promise的学习

    1.Promise的含义: Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Pro ...

  5. Promise探讨

    一.前言 大家都知道JavaScript一大特点就是单线程,为了不阻塞主线程,有些耗时操作(比如ajax)必须放在任务队列中异步执行.传统的异步编程解决方案之一回调,很容易产生臭名昭著的回调地狱问题. ...

  6. 一起学习造轮子(一):从零开始写一个符合Promises/A+规范的promise

    本文是一起学习造轮子系列的第一篇,本篇我们将从零开始写一个符合Promises/A+规范的promise,本系列文章将会选取一些前端比较经典的轮子进行源码分析,并且从零开始逐步实现,本系列将会学习Pr ...

  7. 分步理解 Promise 的实现

    一个 Promise 的运用: var firstPromise = new Promise(function(resolve,reject){ setTimeout(function(){ var ...

  8. HTML5学习笔记(十九):Lambda和Promise

    Lambda 在ES6的标准中称为Arrow Function(箭头函数).下面是一个简单的箭头函数: x => x * x 上面的定义和下面的代码定义效果一样: function (x) { ...

  9. Promise原理剖析

    传统的异步回调编程最大的缺陷是:回调地狱,由于业务逻辑非常复杂,代码串行请求好几层:并行请求以前也要通过引用step.async库实现.现在ES6推出了Promise,通过Promise的链式调用可以 ...

  10. Promise 源码分析

    前言 then/promise项目是基于Promises/A+标准实现的Promise库,从这个项目当中,我们来看Promise的原理是什么,它是如何做到的,从而更加熟悉Promise 分析 从ind ...

随机推荐

  1. Mysql数据库基础第二章:(七)子查询

    Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...

  2. vue界面显示无效的token

    返回登陆界面,重新登陆 登陆成功

  3. JavaScript垃圾回收机制的了解

    对于js种的任意长度字符串,对象,数组是没有固定大小的,只有在分配存储时,解释器就会分配内存来存储这些数据.当js的解释器消耗完系统所有可用内存时,就会造成系统崩溃.因此js有着自己的一套垃圾回收机制 ...

  4. axios上传excal方法

    方法一(适合传文件且带参数的方法) HTML内容 <a href="javascript:;" class="select-file"> <i ...

  5. mongodb地理位置坐标加了索引,操作时报错 Location object expected, location array not in correct format

    别犹豫了,将坐标中的数据改为数字类型即可,如: location:[113.45,34,191]

  6. ethcat开发记录 一

    一.方案 1.移植开源方案SOEM 2.专用芯片 二.SOEM移植 (一)硬件 stm32f407,168M PHY:LAN8720A (ii) Points to note 1, the PHY a ...

  7. IOS弹出系统键盘后,页面不恢复

    <script> var u = navigator.userAgent, app = navigator.appVersion var isIOS = !!u.match(/\(i[^; ...

  8. Day12-面向对象初识

    面向对象编程 Java的核心思想就是OOP 一.面向过程&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么...... 面对过程适合处理一些较为简单的问题 面向对象思想: 物 ...

  9. mysql 获取表信息 表备注等

    select table_name, table_comment, create_time, update_time from information_schema.tables-- where ta ...

  10. char和int的类型转换

    char类型是16位的,底层采用unicode编码保存.char类型是可以直接赋值给int类型的,因为是16位到32位低到高.举个例子比如int i='1';打印i的值是49.char类型跟int类型 ...