在什么大环境下?

今天要讨论的Promise,是js的同步|异步任务的概念下出来的

什么是同步?什么是异步?

我的理解:

一件事情Q

分三部分:Q1 ,  Q2  ,  Q3

同步方式完成: Q1 -> Q2 -> Q3

异步方式完成:  Q1_1 -> Q2 -> Q3 - >Q1_2 【Q1_1 至 Q1_2期间可以有一个代理的角色Promise ~~】

什么是Promise?

很多地方这么解释:Promise是一种更好的代码组织方式,提供一种【全新的视角】来理解异步回调

我所理解的视角的含义有几种:

  电影中经常会出现视角这个词,个人觉得视角的选择影响环境呈现、人物的心情表达。。。

  小说中也经常会出现视角这个词,从不同的视角出发去观察、思考会有不同的效果。。

  画画。。。

  瞬间感觉艺术的相通性。。此时有点心虚

  辣么问题来了?Promise提供的全新的视角是什么?

我脑海里有一个这样的画面:

一个初入职场的小女孩Y,懵懂、青春、聪明、努力。刚开始工作的时候,感觉自己全身被一道道充盈的力量的金光包围着。

她一天的基本工作可分为A,B,C,D,其中不定期会有一些老大或是同事穿插的事件W1,W2,W3.....

刚开始的时候,对于W类事件,她会很热情的立即回应:"等一下哈,等我做完手头上的事,马上进入W类事件。。。"

如果是W1-3的范围的时候还OK,但是当(W>3甚至达到10以上),再这样毫无规律自然的答复缺乏管理,也不专业。

Y总结分析了平时的情况,想到一个方法,使事情看起来不会杂乱,以导致看起来自己忙忙碌碌、没什么成就的赶脚。她找来

一个本子做代理【代理这个异步任务】,大家只要按照顺序的把事情告诉她,只要她有空方便的时候就可以一一帮忙完成了。

这个本子就记录每一个事件的三个状态【未开始、完成:收获结果、任务失败:失败原因】。这样处理之后,YY觉得自己的工作

更在自己的把控之内了,且完成的有条理、更清晰舒服。

----- - ——~~

如何实现一个Promise?

1.异步对象状态和回调函数如何分离

2.如何实现链式调用及管理状态

var PENDING = 1,

  RESOLVED = 2,

  REJECTED = 3;

function Promise(fn){

  var self = this;

  self.state = PENDING;

  self.value = null;

  self.handlers = [];

  function fulfill(result){

    if(self.state === PENDING) {

      self.state = RESOLVED;

      self.value = result;

      for(var i = 0, len = self.handlers.length; i <len; i++) {

        self.handlers[i](result);

      }

    }

  }

  function reject(error){

    if(self.state === PENDING) {

      self.state = REJECTED;

      self.value = error;     

    }

  }

  fn && fn(fulfill, reject);

}

Promise.prototype.then = function(onResolved, onRejected){

  return new Promise(function(resolve, reject){

    var onResolvedFade = function(val){

      var ret = onResolved? onResolved(val): val;

      if(Promise.isPromise(ret)) {

       //回调函数返回值也是Promise

       ret.then(function(val){

         resolve(val);      

       }); 

      }else {

        resolve(ret);

      }

    } 

    

    var onRejectedFade = function(val){
      var ret = onRejected? onRejected(val) : val;

      reject(ret);
    };

    //只是成功的回调进入容器
    self.handlers.push(onResolvedFade);

    if(self.state === FULFILLED) {
      onResolvedFade(self.value);
    }

    if(self._status === REJECTED) {
      onRejectedFade(self.value);
    }

  });

}

Promise的一点感悟~的更多相关文章

  1. 分析jQuery源码时记录的一点感悟

    分析jQuery源码时记录的一点感悟      1.  链式写法      这是jQuery语法上的最大特色,也许该改改POJO里的set方法,和其他的非get方法什么的,可以把多行代码合并,减去每次 ...

  2. 转:五年java人的一点感悟

    转自:五年java人的一点感悟 恍然间,发现自己在这个行业里已经摸爬滚打了五年了,原以为自 己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作的过程中却遭到了 ...

  3. Nodejs Promise的一点记录

    项目需要,看了点nodejs,其中比较难理解的就是Promise了,记录一下学习bluebird提供的Promise实现. Promise.promisifyAll(obj)方法 作用:把对象的方法属 ...

  4. C# CRC校验的一点感悟

    今天在鼓捣一个手持操作器的时候,遇到一点问题,记录一下今天的经验包 由于之前公司产品在校验时基本上都是和校验,今天在准备用C#模拟一个古董操作器的时候,却遇到一个问题,模拟器发出的数据,主板一律不回复 ...

  5. 最近修bug的一点感悟

    写在前面话 项目从13年1月份,现场开发,4月中旬,项目开发接近尾声,三个开发,留两个在现场,我被调回公司,5月份现场一同事离职,只有一个同事在开发,结果PM想让这一个同事承担余下的开发和bug工作, ...

  6. 关于这段时间学习 EntityFramework的 一点感悟

    Ado.Net,用了N多年,Entity Framework也关注了很多年. 每当项目转型的时候,就花费大巴的时间,学习一番,潮流的东西. 这个Orm很多,这个EF很火,这么多年了,我还是不敢用,虽然 ...

  7. javascript 事件的一点感悟

    javascript 冒泡事件的理解一般是这样的: 比方页面上有一个BODY里面包含一个DIV,DIV中包含一个BUTTON.在BODY,DIV,BUTTON中都有一个ONCLICK事件,在BUTTO ...

  8. [原创]android自定义动画的一点感悟

    android提供了一系列的动画处理api,包括animator以及animation等.由于动画效果是根据人眼视觉残留原理形成的,因此动画过程中android需要不断频繁的更新view的相关属性,由 ...

  9. 关于ZF2中一点感悟,service_manager

    在zf2中,在serviceLoctor中自定义的内容,可以通$serviceLocator->get('config')['key'],如果是在serivce_manger中定义的服务名,其实 ...

随机推荐

  1. Linux中(Ubuntu18.04.x/CentOS)mysql8.0.x安装/配置/部署/启动

    The MySQL Connectors and APIs are the drivers and libraries that you use to connect applications in ...

  2. 判断某个元素是否存在于某个 js 数组中

    1.正则表达式 Array.prototype.in_array=function(e){ var r=new RegExp(','+e+','); return (r.test(','+this.j ...

  3. Ajax会自动将返回的对象属性首字母转化为小写

    今天在使用Ajax的时候遇到的问题. $.ajax({ type: "post", url: "<%=basePath%>reserd'f'w/liswe'f ...

  4. js 数字随机滚动(数字递增) 每日凌晨回到原点,重新计算

    html: <div class="textMon"> <!--<img src="./img/20180830160315.png" ...

  5. PAT乙级考前总结(四)

    散列相关问题 1029 旧键盘 (20 分) 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: ...

  6. io读取遇到的问题

    使用Inputstream输入流读取数据的时候总要使用一个额byte[]数组进行读取 byte[] b= new byte[1024]; while((len = in.read(b)) != -1) ...

  7. 走过的easyui的坑--datagrid的reload在IE下未刷新

    至于为什么要进easyui这个坑,就不多说了. 我现在使用的是1.5这个版本,在用它做一个后台管理系统,项目做到一半,才想起记录这些坑. 1.对于datagrid在reload.load在IE下未刷新 ...

  8. C语言入门(1)

    开始学习C语言 第一个C语言程序 #include<stdio.h> int main() { printf("Hello World!"); } C程序结构 1. 头 ...

  9. 后台管理系统好用的UI框架

    https://www.layui.com/demo/form.html

  10. Java面试问题汇总

    转一些面试经验 刚看到下面这份面试清单,从个人的开发面试经历看,里面总结的大部分内容还是很不错的.年后想跳槽的朋友可以选取里面的问题准备一下. GitHub上的面试总结帖 Interview-Note ...