Promise 用es5的基础实现
只实现 then 和 catch
function promise(fn) {
var state = 'pending';
// 声明函数
var nowResolve = function (arg) { return arg };
var nowReject = function (arg) { return arg };
var nextResolve = function (arg) { return arg };
var nextReject = function (arg) { return arg };
var catchReject = function (e) { throw e + ' (in promise)' };
promise.prototype.then = function (res, rej) {
typeof res === 'function' ? nowResolve = res : '';
typeof rej === 'function' ? nowReject = rej : '';
// return 新的对象
return new promise(function (resolve, reject) {
// then 中 return 的值传递给下一个 resolve/reject
nextResolve = resolve;
// 如果 then 中有 reject 回调函数, 则将 return 的值传递给下一个 resolve, 否则继续传递给reject
nextReject = typeof rej === 'function' ? resolve : reject;
// 捕获错误的回调函数
catchReject = reject;
});
}
promise.prototype.catch = function (fn) {
return this.then(null, fn);
}
// 传值到下一个回调,以及异常捕获
function tryCatchFn(state, arg) {
try {
state === 'fulfilled' ? nextResolve(nowResolve(arg)) : nextReject(nowReject(arg));
} catch (e) {
catchReject(e);
}
}
function callback(value) {
return function (arg) {
if (state !== 'pending') { return; }
state = value;
// 如果传参是 promise 构造器生成的对象,传递对象 resolve 的值
if (arg instanceof promise) {
arg.then(function (res) {
tryCatchFn('fulfilled', res);
}, function (rej) {
tryCatchFn('rejected', rej);
});
return;
}
// 如果是普通的传值,setTimeout 是为了 resolve/reject 同步代码的时候正常工作
setTimeout(function () {
tryCatchFn(state, arg);
});
}
}
fn(
callback('fulfilled'),
callback('rejected')
);
}
Promise 用es5的基础实现的更多相关文章
- ES5 & ES6 基础
一.什么是ES5 附上一览表 (5.1中文 (2011.6)): http://lzw.me/pages/ecmascript/ (5.1英文PDF):http://www.ecma-internat ...
- JavaScript面向对象轻松入门之概述(demo by ES5、ES6、TypeScript)
写在前面的话 这是一个JavaScript面向对象系列的文章,本篇文章主要讲概述,介绍面向对象,后面计划还会有5篇文章,讲抽象.封装.继承.多态,最后再来一个综合. 说实话,写JavaScript面向 ...
- Promise杂记
更好的阅度体验 前言 API Promise特点 状态跟随 V8中的async await和Promise 实现一个Promise 参考 前言 作为一个前端开发,使用了Promise一年多了,一直以来 ...
- Promise实践
一.概念 Promise是异步编程的解决方案之一,与事件驱动+回调函数并列. Promise是专门为异步编程设计的封闭的一次性用品,封闭体现在只有异步操作的结果能改变其状态,其他任何操作都不能改变其状 ...
- 分步理解 Promise 的实现
一个 Promise 的运用: var firstPromise = new Promise(function(resolve,reject){ setTimeout(function(){ var ...
- Promise API
Promise API 刚刚接触promise这个东西,网上看了很多博客,大部分是讲怎么用Promise,丝毫没提怎么实现Promise. 我不甘 心,可是真去看JQuery或者Angular ...
- 45道Promise面试题
来看看通过阅读本篇文章要点: Promise的几道基础题 Promise结合setTimeout Promise中的then.catch.finally Promise中的all和race async ...
- 从C#到TypeScript - async await
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- Axios 的基本使用
Axios 是一个基于 promise 的HTTP 库, 可以用在浏览器和 node.js 中. 1. 从浏览器创建 XMLHttpRequests 2. 从node.js 创建 http 请求 3. ...
随机推荐
- JSP介绍(4)--- JSP 过滤器
过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的: 在客户端的请求访问后端资源之前,拦截这些请求. 在服务器的响应发送回客户端之前,处理这些响应. 过滤器通过 Web 部署描述符 ...
- PowerDesigner生成CDM模型
一.新建概念数据模型 1)选择File-->New,弹出如图所示对话框,选择CDM模型(即概念数据模型)建立模型. 2)完成概念数据模型的创建.以下图示,对当前的工作空间进行简单介绍.(以后再 ...
- 使用py 和flask 实现的服务器系统目录浏览,日志文件实时显示到网页的功能
看日志希望带有彩色,希望从浏览器上看到,不用连到机器上看. 浏览系统的文件夹,scan + 系统文件夹的层级名字当做url路由,可以深层次看到机器上任何层级的文件夹,实现系统文件夹浏览下载. 如果是点 ...
- BluetoothGetRadioInfo 函数
DWORD BluetoothGetRadioInfo( HANDLE hRadio, PBLUETOOTH_RADIO_INFO pRadioInfo );获取蓝牙设备的信息.参数: hRadio ...
- 并行fp-growth图解(mahout)
FP-growth Apriori算法的一个主要瓶颈在于,为了获得较长的频繁模式,需要生成大量的候选短频繁模式.FP-Growth算法是针对这个瓶颈提出来的全新的一种算法模式.目前,在数据挖掘领域,A ...
- Windows使用Github
首先,你需要执行下面两条命令,作为 git 的基础配置,作用是告诉 git 你是谁,你输入的信息将出现在你创建的提交中. git config --global user.name "你的名 ...
- Other - 个人对知识讨论、分享等平台上抄袭乱象的看法
在某论坛上看到这样一句话,深表赞同.
- Java学习笔记(一)语法
基本语法 大小写敏感 类名:对于所有的类来说,类名的首字母应该大写 方法名:所有的方法名都应该以小写字母开头.如果方法名含有若干单词,则后面的每个单词首字母大写. 源文件名:源文件名必须和类名相同.当 ...
- 实现one hot encode独热编码的两种方法
实现one hot encode的两种方法: https://stackoverflow.com/questions/37292872/how-can-i-one-hot-encode-in-pyth ...
- EIP权限工作流平台总结-4跨域配置
1.预览地址:www.eipflow.com (1) 权限工作流:www.demo.eipflow.com/Account/Login (2) 基础权限版:www.auth.eipflow.com/A ...