示例

// 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. 【剑指Offer】【链表】链表中倒数第k个结点

    题目:输入一个链表,输出该链表中倒数第k个结点. A1:先从头到尾扫描链表,得到链表的总长度n,然后再扫描一次链表,输出n-k+1处的结点  ===> 测试用例超时 A2:创建两个指针,一个遍历 ...

  3. 关于promise经典面试题

    这里涉及到同步和异步的问题

  4. pgsql表结构复制

    CREATE TABLE pavement_damage_dtl_temp(like pavement_damage_dtl); 搜索 复制

  5. 移动端判断是否存在app

    网上有很多类似的判断,我看到的最新的是2020年的 但是在我项目中都遇到了问题 ios很简单,只要你给出跳转app的url就可以了,如果没有app就会自动的去调到app store 安卓系统就很恶心了 ...

  6. 【七侠传】冲刺阶段--Day7

    [七侠传]冲刺阶段--Day7 团队成员 20181221曾宇涛 20181202李祎铭 20181209沙桐 20181215薛胜瀚 20181216杨越麒 20181223何家豪 20181232 ...

  7. linux命令关机和重启命令及文件查找管道符用法linux grep

    关机和重启命令 Shutdown Reboot Halt poweroff grep和管道符 昨天的时候 leader 给我出了道问题: 找出文件夹下包含 "aaa" 同时不包含 ...

  8. word在指定页面设置页码

    需求:比如,毕业论文前面几页要求罗马数字(摘要-目录)(这里设置页码格式即可完成),后面全是阿拉伯数字(这里比较难搞,以下方法是解决这里的) 方法: 1. 光标移到指定页面的第一个字符所在的位置前 2 ...

  9. js小数相加精度不准确

    例: 0.1+0.1+0.1+0.7 != 1 0.1+0.2 != 0.3 解决办法: 相加 function addNum(num1, num2) {         let sq1, sq2; ...

  10. xml与DataSet互转

    //将DataSet转换为xml字符串   public static string ConvertDataSetToXMLFile(DataSet xmlDS, Encoding encoding) ...