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. ...
随机推荐
- windows7下安装gem包---bcrypt-ruby
在Gemfile中添加 gem 'bcrypt-ruby', '~> 3.0.0' 然后执行bundle install,rails服务启动没有问题,但是运行程序时页面报错如下: cannot ...
- linux日常管理-抓包工具tcpdump和tshark
抓包工具:查看什么数据占用网卡,把带宽跑满了. 命令:tcpdump 选项:host 指定IP port 指定端口 -c 指定包数量 -w 指定写入文件,不加显示的不是流量包而是流量走向 -nn 作用 ...
- C语言学习笔记--struct 和 union关键字
1.struct关键字 C 语言中的 struct 可以看作变量的集合struct中的每个数据成员都有独立的存储空间. 结构体与柔性数组 (1)柔性数组即数组大小待定的数组 (2)C 语言中可以由结构 ...
- mount/umount文件挂载
用法: mount [-lhV] mount -a [选项] mount [选项] [--source] <源> | [--target] <目录> mount [选项] &l ...
- R: matrix & array 生成、操作矩阵、数组:
################################################### 问题:生成.操作矩阵 18.4.27 怎么生成矩阵 matrix.,,及其相关操作 ??? ...
- 11、比对软件STAR(https://github.com/alexdobin/STAR)
转载:https://mp.weixin.qq.com/s?__biz=MzI1MjU5MjMzNA==&mid=2247484731&idx=1&sn=b15fbee5910 ...
- GET POST区别不同情况
相信大家在面试的时候经常会被问到:GET与POST有什么区别吧?你是怎么回答的呢?POST比GEt安全?GET有URL的长度限制而POST没有或者很大?GET通过URL或者Cookie传参数,POST ...
- LINQ中的陷阱--TakeWhile&SkipWhile
在用TakeWhile,SkipWhile设置陷阱之前,我们先来看一看他们的兄弟Take和Skip: public static IEnumerable<T> Take<T>( ...
- 【Qt官方例程学习笔记】Analog Clock Window Example (画笔的平移/旋转/缩放应用)
这个例子演示了如何使用QPainter的转换和缩放特性来简化绘图. 值得学习的: 定时器事件ID检查: 在定时器事件中检查定时器id是比较好的实践. QPainter抗锯齿: We call QPai ...
- Django 之 auth 模块
Django 内置一个 auth 模块,帮助用户实现注册.登录.注销以及修改密码等功能,帮助开发者省去了很多功夫. auth 模块 在创建模型时,Django内部会生成一个名为 auth_user 的 ...