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. ...
 
随机推荐
- centos6 启动流程
			
具体过程:1)加载BIOS的硬件信息,执行BIOS内置程序.2)读取MBR(Master Boot Record)中Boot Loader中的引导信息.3)加载内核Kernel boot到内存中.4) ...
 - eclipse安装WTP部署WEB项目
			
打开WTP官方安装指南,找到想要的下载站点 http://wiki.eclipse.org/WTP_FAQ#How_do_I_install_WTP.3F 我选择的是http://download.e ...
 - Spring pom配置详解(转)
			
转载至http://blog.csdn.net/ithomer/article/details/9332071# 原博主注释的很详细 <project xmlns="http://ma ...
 - JavaScript学习系列6  -- JavaScript中的垃圾回收(内存释放)
			
程序开发中,涉及到的内存生命周期基本是一样的,分为以下三步 1. 分配需要的内存 2. 使用分配到的内存 3. 释放其内存 ----什么时候释放内存,以及需要释放哪些变量的内存, 就是垃圾回收机 ...
 - 5.SSRF服务器端请求伪造
			
SSRF(服务端请求伪造):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞. 一般情况下,SSRF攻击的目标是从外网无法访问的内部系统.(正是因为它是由服务端发起的,所以它能够请求到与它相连而与 ...
 - UVa 11020 Efficient Solutions (BST)
			
题意:给按顺序给定 n 个人群,用x和y来描述,如果有没有任何一个x' < x y' <= y 或 x '<= x y' <= y,那么这个群体就是优势群体, 让你求出每放入一 ...
 - SQL查询 若为空显示默认值
			
COALESCE(a.end_,now()) SELECT COALESCE(NULL,NULL,3,4,5) FROM
 - 1.jQuery入口函数 与javaScript入口函数
			
1.jQuery入口函数 与javaScript入口函数 JQ入口函数: $(document).ready(function(){ }); 或者 $(function(){ }) Js入口函数: w ...
 - webconfig连接数据库配置
			
<connectionStrings> <add name="sqlConnection" connectionString="server=----- ...
 - Java中Class Type 类类型是怎么回事?
			
Java中三种方式可以用来表示Class Type(类的实例对象), 第一种,通过隐藏的静态成员变量class来表示:第二种,通过调用该类的对象的getClass方法:第三种,通过Class.forN ...