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. ...
随机推荐
- VisualGDB系列1:VisualGDB总体概述
根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 本文总体介绍VisualGDB能给你带来 ...
- VUE之使用百度地图API
利用vue创建点餐系统,在点餐系统中需要知道商家地址信息,这时就需要借用百度地图API. 步骤一:申请百度地图密钥: 步骤二:在index.html中添加百度地图JavaScript API接口: & ...
- jquery.html5uploader.js 上传控件
插件地址:http://blog.csdn.net/never_say_goodbye/article/details/8598521 先上个效果图: 相比来说,效果还是很不错的 使用MVC3做服务器 ...
- Tournament
题意: 有 $n$ 个 $K$ 维向量,若向量A只要有任意一维大于向量B,则认为A可能打败B,将n个向量一个一个加入,求问对于每次加完后的向量集合:有几个向量可能活到最后. 解法: 考虑如果A可以打败 ...
- 再次总结Linux最常用命令
cp,,mv,,rm,,rmdir,,mkdir,,more,,touch,,head,,tail,,pwd,, less 按q退出,空格翻页,回车 上下键滚动行 -N 显示行号 -S 行过长时 ...
- Luogu 4556 雨天的尾巴
主席树+线段树合并. 首先我们想一想如果只有一个结点的话,我们弄一个权值线段树就可以随便维护了. 那么我们可以运用差分的思想,把一个询问拆成四个操作,对于一个询问$(x, y, v)$,我们在$x$的 ...
- redis学习总结2
redis配置文件说明:以下这篇文章已经说明的很明白了.感谢~ http://blog.sina.com.cn/s/blog_636415010101970j.html
- 会过vip怎么赚钱?大学生,宝妈创业圈子
会过vip怎么赚钱?是骗局吗1.如果说会过Vip不赚钱,那么一定是我们的没有时间去真心的热爱她:如果你对她如果你对它抱着一颗平和的心,认真的去分享,认真的去听一些前辈的经验,赚钱真的不是难事:2.如果 ...
- Asp.Net 之 Web.config 配置文件详解 -转
在asp.net中配置文件名一般默认是web.config.每个web.config文件都是基于XML的文本文件,并且可以保存到Web应用程序中的任何目录中.在发布Web应用程序时web.config ...
- 第一个Python工程
创建你的第一个Python程序 如果你曾经很熟悉visual studio的工作方式.可能对python不习惯. 工程通常只与你使用的IDLE有关系.这些工具习惯将文档,编译,测试集成一体.所以就存在 ...