es6中promise ALL Race Resolve Reject finish的实现
function mypromise(func){
this.statue = "pending";
this.data = null;
this.resolveCallback = [];
this.rejectCallback = [];
this._final = null;
var self = this;
var resolve = function(data){
if (data instanceof mypromise) {
data.then(resolve,reject)
return;
}
setTimeout(function(){
if(self.statue != "pending") return;
self.data = data;
self.statue = "resolve";
for(var i = 0; i < self.resolveCallback.length; i++){
var item = self.resolveCallback[i];
item.bind(self)(data)
}
},0)
}
var reject = function(data){
setTimeout(function(){
if(self.statue != "pending") return;
self.data = data;
self.statue = "reject";
for(var i = 0; i < self.rejectCallback.length; i++){
var item = self.rejectCallback[i];
item.bind(self)(data)
}
},0)
}
try {
if (typeof func == 'function'){
func.bind(this)(resolve,reject);
}else{
if(func == 'reject'){
this.statue = "reject";
reject();
}else{
this.statue = "resolve";
resolve();
}
}
} catch (e) {
reject(e)
}
}
mypromise.prototype.then = function(onresolve,onreject){
var self = this;
onresolve = typeof onresolve === 'function' ? onresolve : function(data){return data;}
onreject = typeof onreject === 'function' ? onreject : function(data){return data;}
if(self.statue == "pending"){
return new mypromise(function(resolve,reject){
var _this = this;
self.resolveCallback.push(function(data){
var x = onresolve(data);
if(x instanceof mypromise){
x.then(resolve,reject)
}else{
resolve(x)
}
typeof _this._final == 'function' ? _this._final() : null;
})
self.rejectCallback.push(function(data){
var x = onreject(data);
if(x instanceof mypromise){
x.then(resolve,reject)
}else{
reject(x)
}
typeof _this._final == 'function' ? _this._final() : null;
})
});
}
if(self.statue == "resolve"){
return new mypromise(function(resolve,reject){
var x = onresolve(self.data);
if(x instanceof mypromise){
x.then(resolve,reject)
}else {
resolve(x);
}
typeof this._final == 'function' ? this._final() : null;
});
}
if(self.statue == "reject"){
return new mypromise(function(resolve,reject){
var x = onreject(self.data);
if(x instanceof mypromise){
x.then(resolve,reject)
}else {
reject(x);
}
typeof this._final == 'function' ? this._final() : null;
});
}
}
mypromise.prototype.catch = function(reject){
return this.then(null,reject);
}
mypromise.All = function(){
var allArguments = arguments;
var len = allArguments.length,
item = null,
successResult = [],
failResult = []
resultData = [];
return new mypromise(function(resolve,reject){
function resolver(index){
return function(data){
successResult.push(1);
resolveAll(index,data);
}
}
function rejecter(index){
return function(data){
failResult.push(1);
resolveAll(index,data);
}
}
function resolveAll(index,data){
resultData.push({index:index,data:data})
if(successResult.length + failResult.length == len){
if( successResult.length == len){
resolve(resultData)
}else{
reject(data)
}
}
}
for(var i = 0; i < len; i++){
item = allArguments[i];
if(!(item instanceof mypromise)){
throw new TypeError("you must pass promise to mypromise.all")
}
item.then(resolver(i),rejecter(i))
}
})
}
mypromise.Race = function(){
var allArguments = arguments;
var len = allArguments.length,
item = null,
successResult = [],
failResult = [];
return new mypromise(function(resolve,reject){
function resolver(data){
successResult.push(1);
resolveAll(data);
}
function rejecter(data){
failResult.push(1);
reject(data);
}
function resolveAll(data){
resolve(data)
}
for(var i = 0; i < len; i++){
item = allArguments[i];
if(!(item instanceof mypromise)){
throw new TypeError("you must pass promise to mypromise.all")
}
item.then(resolver,rejecter)
}
})
}
mypromise.Resolve = function(func){
if(func instanceof mypromise){
return func;
}else{
return new mypromise('resolve');
}
}
mypromise.Reject = function(func){
return new mypromise('reject');
}
mypromise.prototype.Final = function(onresolve){
this._final = onresolve;
}
es6中promise ALL Race Resolve Reject finish的实现的更多相关文章
- 对于ES6中Promise的个人见解
1.js中常见的异步 JavaScript可以响应用户的一些异步交互,比如单击鼠标和按键盘等操作. let button = document.getElementById("btn&quo ...
- ES6中Promise对象个人理解
Promise是ES6原生提供的一个用来传递异步消息的对象.它减少了传统ajax金字塔回调,可以将异步操作以同步操作的流程表达出来使得代码维护和可读性方面好很多. Promise的状态: 既然是用来传 ...
- ES6中promise的使用方法
先看看ES5中异步编程的使用. let ajax = function (callBlack) { setTimeout(function () { callBlack && call ...
- ES6 中 Promise
在说Promise之前我们先简单说一下什么是同步异步? 同步(Sync):所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作. 异步(Async):异步与同步相对, ...
- ES6中promise总结
一.什么是ES6的Promise 讲太多也没有.直接在打印出来就好,console.dir(Promise) Promise 是一个构造函数,自身有all, reject, resolve 这几个眼熟 ...
- ES6 中 Promise 详解
Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Promise 提供统一的 API ...
- ES6中Promise详解
Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息. Promise 提供统一的 AP ...
- ES6中Promise的入门(结合例子)
一.Promise的前言 解决回调地狱 //以往回调方式 函数1(function(){ //代码执行...(ajax1) 函数2(function(){ //代码执行...(ajax2) 函数3(f ...
- 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出
1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) { if (success){ ...
随机推荐
- WPF线程中获取控件的值和给控件赋值
WPF中使用线程操作控件,按平常的操作方法操作的话会报异常:调用线程无法访问此对象,因为另一个线程拥有该对象.所以我们要使用Dispatcher类的BeginInvoke()与Invoke()方法.B ...
- hi-nginx-1.4.9正式发布,支持javascript后端开发
hi-nginx-1.4.9已经发布. 更新: 支持javascript后端开发 修复脚本搜索的一个bug 从这一版开始,hi-nginx开始支持javascript,这意味着把javascript应 ...
- Linux替换文件内容sed命令
sed -e 4a\newline testfile //在第四行后添加一行,并将结果输出到标准输出.-e,以指定脚本处理文本文件:a,新增. nl /etc/passwd | sed '2,5d' ...
- Linux编译安装python3
1.解决编译环境的,依赖环境,必须保证这里正确安装,方可执行后续步骤yum install gcc patch libffi-devel python-devel zlib-devel bzip2-d ...
- WSDL文档
portType 相当于一个类. operation 相当于该类里有一个方法名,方法名为processAPNManagement,该方法里有一个输入消息,一个输出消息,一个错误消息.
- 【记录】VMware解决网络找不到服务器的问题
本想在虚拟机上的Linux上练习安装Mysql8.0版本的,网络连不上的问题卡了N天简直 1. 点击虚拟机右键设置,虚拟机默认设置为NAT模式,这里无需修改. 2. 点击编辑,虚拟网络设置,勾选主机连 ...
- Yii1操作phpexcel
Yii::import('application.vendors.phpexcel.*'); Yii::import('application.vendors.phpexcel.PHPExcel.*' ...
- 后端必备的Linux知识
目录 从认识操作系统开始 操作系统简介 操作系统简单分类 初探Linux Linux简介 Linux诞生简介 Linux的分类 Linux文件系统概览 Linux文件系统简介 文件类型与目录结构 Li ...
- JDK源码分析(12)之 ConcurrentHashMap 详解
本文将主要讲述 JDK1.8 版本 的 ConcurrentHashMap,其内部结构和很多的哈希优化算法,都是和 JDK1.8 版本的 HashMap是一样的,所以在阅读本文之前,一定要先了解 Ha ...
- kubernets controller 和 CRD的扩展
sample git repo 各个组件开发指导 operator 介绍 此图来自谷歌员工的实践介绍 client-go的使用和源码分析 (dlv) p pods *k8s.io/api/core/v ...