Promise的一点感悟~
在什么大环境下?
今天要讨论的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的一点感悟~的更多相关文章
- 分析jQuery源码时记录的一点感悟
分析jQuery源码时记录的一点感悟 1. 链式写法 这是jQuery语法上的最大特色,也许该改改POJO里的set方法,和其他的非get方法什么的,可以把多行代码合并,减去每次 ...
- 转:五年java人的一点感悟
转自:五年java人的一点感悟 恍然间,发现自己在这个行业里已经摸爬滚打了五年了,原以为自 己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作的过程中却遭到了 ...
- Nodejs Promise的一点记录
项目需要,看了点nodejs,其中比较难理解的就是Promise了,记录一下学习bluebird提供的Promise实现. Promise.promisifyAll(obj)方法 作用:把对象的方法属 ...
- C# CRC校验的一点感悟
今天在鼓捣一个手持操作器的时候,遇到一点问题,记录一下今天的经验包 由于之前公司产品在校验时基本上都是和校验,今天在准备用C#模拟一个古董操作器的时候,却遇到一个问题,模拟器发出的数据,主板一律不回复 ...
- 最近修bug的一点感悟
写在前面话 项目从13年1月份,现场开发,4月中旬,项目开发接近尾声,三个开发,留两个在现场,我被调回公司,5月份现场一同事离职,只有一个同事在开发,结果PM想让这一个同事承担余下的开发和bug工作, ...
- 关于这段时间学习 EntityFramework的 一点感悟
Ado.Net,用了N多年,Entity Framework也关注了很多年. 每当项目转型的时候,就花费大巴的时间,学习一番,潮流的东西. 这个Orm很多,这个EF很火,这么多年了,我还是不敢用,虽然 ...
- javascript 事件的一点感悟
javascript 冒泡事件的理解一般是这样的: 比方页面上有一个BODY里面包含一个DIV,DIV中包含一个BUTTON.在BODY,DIV,BUTTON中都有一个ONCLICK事件,在BUTTO ...
- [原创]android自定义动画的一点感悟
android提供了一系列的动画处理api,包括animator以及animation等.由于动画效果是根据人眼视觉残留原理形成的,因此动画过程中android需要不断频繁的更新view的相关属性,由 ...
- 关于ZF2中一点感悟,service_manager
在zf2中,在serviceLoctor中自定义的内容,可以通$serviceLocator->get('config')['key'],如果是在serivce_manger中定义的服务名,其实 ...
随机推荐
- Unity UGUI Layout自动排版组件用法介绍
Unity UGUI布局组件 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...
- Qt学习3---子窗口与父窗口
创建子窗口后,主窗口的头文件需要 #include "子窗口头文件" 子窗口和父窗口之间相互切换 子窗口没有办法处理父窗口,子窗口此时就需要一个信号: * 信号必须有signal ...
- java 环境的安装、设置免密登陆、进行hadoop安装、关闭防火墙
1.去这个网站下载对应的版本:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html我这 ...
- kylin cubing algorithm(算法)
看到这一块的视频,结合光方博客的一些文档及自己的一点理解,记个笔记,以备不时之需. by layer cubing 1.on MR 这个算法的对cube的计算就像它的名字一样是按player进行的. ...
- java jdk jre
Java11新特性: https://www.cnblogs.com/eric-shao/p/10025180.html java的一些基本概念——java11.jdk.jre.jvm: https: ...
- BootStrap的table技术小结:数据填充、分页、列宽可拖动
本文结构:先说明,后代码.拷贝可直接运行. 一.demo结构: 二.文件引入 这些里面除了下面2个比较难找,其他的都很好找 bootstrap-table-resizable.js colResiza ...
- React 生命周期简介
React 中组件的生命周期会经历如下三个过程:装载过程.更新过程.卸载过程. 装载过程:组件实例被创建和插入 DOM 树的过程: 更新过程:组件被重新渲染的过程: 卸载过程:组件从 DOM 树 ...
- C语言学习笔记之位运算求余
我们都知道,求一个数被另一个数整除的余数,可以用求余运算符”%“,但是,如果不允许使用求余运算符,又该怎么办呢?下面介绍一种方法,是通过位运算来求余,但是注意:该方法只对除数是2的N次方幂时才有效. ...
- 2019软件工程第二次作业(VS2017中对C++的单元测试)
建立工程,分别编写cpp和头文件 cpp文件中的代码如下: #include<iostream> #include"test.h" using namespace st ...
- JWT(JSON Web Token) 【转载】
JWT(JSON Web Token) 什么叫JWTJSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. 一般来说,互联网用户认证是这样子的. 1.用户向服务器发送用户名和密码. ...